first commit

This commit is contained in:
2026-09-30 00:43:24 +07:00
commit d77a09cff4
12 changed files with 4856 additions and 0 deletions

View File

@@ -0,0 +1,577 @@
<mxfile host="Electron" agent="ChatGPT" pages="7">
<diagram id="dashboard" name="1. Dashboard">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="d_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault" vertex="1">
<mxGeometry height="860" width="230" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="⌂ Dashboard" vertex="1">
<mxGeometry height="44" width="180" x="85" y="130" as="geometry" />
</mxCell>
<mxCell id="d_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="◷ Meetings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="190" as="geometry" />
</mxCell>
<mxCell id="d_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="⚙ Settings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="250" as="geometry" />
</mxCell>
<mxCell id="d_user" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Signed in as alex@example.com" vertex="1">
<mxGeometry height="70" width="180" x="85" y="800" as="geometry" />
</mxCell>
<mxCell id="d_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Good morning" vertex="1">
<mxGeometry height="40" width="420" x="340" y="90" as="geometry" />
</mxCell>
<mxCell id="d_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Record, transcribe, summarize, and follow up on meetings." vertex="1">
<mxGeometry height="30" width="560" x="340" y="135" as="geometry" />
</mxCell>
<mxCell id="d_start" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="+ Start new meeting" vertex="1">
<mxGeometry height="48" width="250" x="1210" y="90" as="geometry" />
</mxCell>
<mxCell id="d_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="340" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card1h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Quick start" vertex="1">
<mxGeometry height="30" width="180" x="365" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card1b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Microphone: Default System&amp;nbsp;&lt;div&gt;audio: On Local STT: Whisper small&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="360" y="290" as="geometry" />
</mxCell>
<mxCell id="d_card1btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Start recording" vertex="1">
<mxGeometry height="38" width="160" x="365" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="720" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card2h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live overlay" vertex="1">
<mxGeometry height="30" width="180" x="745" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card2b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Overlay: Enabled&amp;nbsp;&lt;div&gt;Position: Bottom center&amp;nbsp;&lt;/div&gt;&lt;div&gt;Speaker labels: On&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="745" y="280" as="geometry" />
</mxCell>
<mxCell id="d_card2btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Preview overlay" vertex="1">
<mxGeometry height="38" width="170" x="745" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="360" x="1100" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card3h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Storage" vertex="1">
<mxGeometry height="30" width="180" x="1125" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card3b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="SeaweedFS connected&amp;nbsp;&lt;div&gt;Storage used: 12.8 GB Uploads: healthy&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="1125" y="290" as="geometry" />
</mxCell>
<mxCell id="d_storagechip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Connected" vertex="1">
<mxGeometry height="26" width="110" x="1270" y="245" as="geometry" />
</mxCell>
<mxCell id="d_recenth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Recent meetings" vertex="1">
<mxGeometry height="30" width="220" x="340" y="455" as="geometry" />
</mxCell>
<mxCell id="d_table" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="300" width="1120" x="340" y="500" as="geometry" />
</mxCell>
<mxCell id="d_th0" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Title" vertex="1">
<mxGeometry height="28" width="230" x="360" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Date" vertex="1">
<mxGeometry height="28" width="140" x="760" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Duration" vertex="1">
<mxGeometry height="28" width="120" x="930" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th3" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Status" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th4" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Actions" vertex="1">
<mxGeometry height="28" width="140" x="1270" y="515" as="geometry" />
</mxCell>
<mxCell id="d_r0t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="34" width="340" x="360" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="48 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="558" as="geometry" />
</mxCell>
<mxCell id="d_r0a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="557" as="geometry" />
</mxCell>
<mxCell id="d_r1t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Backend Architecture Review" vertex="1">
<mxGeometry height="34" width="340" x="360" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 26, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="61 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="628" as="geometry" />
</mxCell>
<mxCell id="d_r1a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="627" as="geometry" />
</mxCell>
<mxCell id="d_r2t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Client Planning Call" vertex="1">
<mxGeometry height="34" width="340" x="360" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 25, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="35 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Processing" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="698" as="geometry" />
</mxCell>
<mxCell id="d_r2a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="697" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="live" name="2. Live Meeting">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="l_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="l_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault • Live Meeting" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="l_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="l_timer" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="● REC 00:18:42" vertex="1">
<mxGeometry height="40" width="200" x="1260" y="140" as="geometry" />
</mxCell>
<mxCell id="l_left" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="860" x="100" y="210" as="geometry" />
</mxCell>
<mxCell id="l_transh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live transcription" vertex="1">
<mxGeometry height="30" width="240" x="125" y="235" as="geometry" />
</mxCell>
<mxCell id="l_s1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="290" as="geometry" />
</mxCell>
<mxCell id="l_s1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the upload flow before Friday." vertex="1">
<mxGeometry height="42" width="630" x="250" y="285" as="geometry" />
</mxCell>
<mxCell id="l_s2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="125" y="360" as="geometry" />
</mxCell>
<mxCell id="l_s2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I can take the SeaweedFS integration and the presigned URL endpoint." vertex="1">
<mxGeometry height="54" width="630" x="250" y="355" as="geometry" />
</mxCell>
<mxCell id="l_s1b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="435" as="geometry" />
</mxCell>
<mxCell id="l_s1btxt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Great. I will handle the meeting job queue and reminders." vertex="1">
<mxGeometry height="54" width="630" x="250" y="430" as="geometry" />
</mxCell>
<mxCell id="l_partial" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Speaker 2 • listening…" vertex="1">
<mxGeometry height="48" width="760" x="125" y="525" as="geometry" />
</mxCell>
<mxCell id="l_wave" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="▁▃▅▆▅▃▂▁▂▅▇▆▃▂▁" vertex="1">
<mxGeometry height="40" width="760" x="125" y="600" as="geometry" />
</mxCell>
<mxCell id="l_controls" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Pause" vertex="1">
<mxGeometry height="40" width="110" x="125" y="690" as="geometry" />
</mxCell>
<mxCell id="l_overlaybtn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Show overlay" vertex="1">
<mxGeometry height="40" width="150" x="250" y="690" as="geometry" />
</mxCell>
<mxCell id="l_finish" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Finish meeting" vertex="1">
<mxGeometry height="40" width="160" x="725" y="690" as="geometry" />
</mxCell>
<mxCell id="l_right" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="460" x="1000" y="210" as="geometry" />
</mxCell>
<mxCell id="l_speakersh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Speakers" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="235" as="geometry" />
</mxCell>
<mxCell id="l_sp1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 1" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="285" as="geometry" />
</mxCell>
<mxCell id="l_rename1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="285" as="geometry" />
</mxCell>
<mxCell id="l_sp2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 2" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="345" as="geometry" />
</mxCell>
<mxCell id="l_rename2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="345" as="geometry" />
</mxCell>
<mxCell id="l_audioh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio sources" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="435" as="geometry" />
</mxCell>
<mxCell id="l_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Microphone" vertex="1">
<mxGeometry height="38" width="180" x="1025" y="480" as="geometry" />
</mxCell>
<mxCell id="l_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ System audio" vertex="1">
<mxGeometry height="38" width="190" x="1220" y="480" as="geometry" />
</mxCell>
<mxCell id="l_stth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Local transcription" vertex="1">
<mxGeometry height="30" width="220" x="1025" y="555" as="geometry" />
</mxCell>
<mxCell id="l_stt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Whisper small Device: GPU Latency: ~1.2 s" vertex="1">
<mxGeometry height="90" width="260" x="1025" y="595" as="geometry" />
</mxCell>
<mxCell id="l_sttchip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Healthy" vertex="1">
<mxGeometry height="28" width="100" x="1300" y="610" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="overlay" name="3. Live Overlay">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="o_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Desktop / meeting app background" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="o_fakeapp" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video conference / presentation area" vertex="1">
<mxGeometry height="600" width="1100" x="250" y="130" as="geometry" />
</mxCell>
<mxCell id="o_toolbar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault overlay controls" vertex="1">
<mxGeometry height="42" width="320" x="1030" y="90" as="geometry" />
</mxCell>
<mxCell id="o_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#374151;fontColor=#ffffff;opacity=92;" vertex="1">
<mxGeometry height="190" width="820" x="390" y="590" as="geometry" />
</mxCell>
<mxCell id="o_sp1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#93c5fd;" value="Alice" vertex="1">
<mxGeometry height="28" width="100" x="425" y="620" as="geometry" />
</mxCell>
<mxCell id="o_txt1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="40" width="720" x="425" y="650" as="geometry" />
</mxCell>
<mxCell id="o_sp2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#86efac;" value="Bob" vertex="1">
<mxGeometry height="28" width="100" x="425" y="700" as="geometry" />
</mxCell>
<mxCell id="o_txt2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="40" width="720" x="425" y="730" as="geometry" />
</mxCell>
<mxCell id="o_hint" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Overlay options: drag • resize • opacity • font size • click-through • show/hide speaker labels" vertex="1">
<mxGeometry height="30" width="820" x="390" y="805" as="geometry" />
</mxCell>
<mxCell id="6jg8ZA6zPTfZGke1Gjl6-1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;Click the speaker&#39;s name to rename&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="720" x="410" y="580" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="speaker" name="4. Rename Speakers">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="s_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Live meeting screen (dimmed)" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="s_modal" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="600" width="660" x="470" y="160" as="geometry" />
</mxCell>
<mxCell id="s_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Rename speakers" vertex="1">
<mxGeometry height="40" width="300" x="510" y="200" as="geometry" />
</mxCell>
<mxCell id="s_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Speaker labels are local to this meeting. Rename them anytime during the session." vertex="1">
<mxGeometry height="40" width="520" x="510" y="245" as="geometry" />
</mxCell>
<mxCell id="s_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="320" as="geometry" />
</mxCell>
<mxCell id="s_label1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="535" y="342" as="geometry" />
</mxCell>
<mxCell id="s_input1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Alice" vertex="1">
<mxGeometry height="42" width="360" x="535" y="382" as="geometry" />
</mxCell>
<mxCell id="s_save1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="382" as="geometry" />
</mxCell>
<mxCell id="s_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="470" as="geometry" />
</mxCell>
<mxCell id="s_label2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="535" y="492" as="geometry" />
</mxCell>
<mxCell id="s_input2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Bob" vertex="1">
<mxGeometry height="42" width="360" x="535" y="532" as="geometry" />
</mxCell>
<mxCell id="s_save2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="532" as="geometry" />
</mxCell>
<mxCell id="s_note" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Tip: if diarization temporarily swaps speakers, you can reassign the latest segment from the transcript view." vertex="1">
<mxGeometry height="60" width="540" x="510" y="630" as="geometry" />
</mxCell>
<mxCell id="s_close" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Close" vertex="1">
<mxGeometry height="42" width="150" x="900" y="690" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="review" name="6. Meeting Review">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="r_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="r_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault / Weekly Product Sync" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="r_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="r_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 speakers" vertex="1">
<mxGeometry height="30" width="420" x="100" y="185" as="geometry" />
</mxCell>
<mxCell id="r_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / audio player 00:18:42 / 00:48:05" vertex="1">
<mxGeometry height="220" width="700" x="100" y="240" as="geometry" />
</mxCell>
<mxCell id="r_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="180" x="100" y="510" as="geometry" />
</mxCell>
<mxCell id="r_tbox" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Alice 00:18:41 We should finalize the API contract before tomorrow. Bob 00:18:49 I will update the database migration tonight. Alice 00:19:02 Perfect, then I&#39;ll prepare the release notes." vertex="1">
<mxGeometry height="260" width="700" x="100" y="550" as="geometry" />
</mxCell>
<mxCell id="r_sumh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Summary" vertex="1">
<mxGeometry height="30" width="200" x="850" y="240" as="geometry" />
</mxCell>
<mxCell id="r_sum" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration tonight, while Alice prepares the release notes." vertex="1">
<mxGeometry height="140" width="590" x="850" y="280" as="geometry" />
</mxCell>
<mxCell id="r_taskh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Action items" vertex="1">
<mxGeometry height="30" width="200" x="850" y="465" as="geometry" />
</mxCell>
<mxCell id="r_task1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Update database migration Bob • Due tonight" vertex="1">
<mxGeometry height="70" width="590" x="850" y="505" as="geometry" />
</mxCell>
<mxCell id="r_task2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Prepare release notes Alice • Due tomorrow" vertex="1">
<mxGeometry height="70" width="590" x="850" y="590" as="geometry" />
</mxCell>
<mxCell id="r_rem" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="42" width="180" x="850" y="705" as="geometry" />
</mxCell>
<mxCell id="r_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export transcript" vertex="1">
<mxGeometry height="42" width="180" x="1050" y="705" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker&#39;s name" vertex="1">
<mxGeometry height="42" width="180" x="420" y="505" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy transcript" vertex="1">
<mxGeometry height="42" width="180" x="620" y="505" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="meeting_details" name="7. Meeting Details">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="md_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="md_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault / Meetings / Weekly Product Sync" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="md_back" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="← Back to meetings" vertex="1">
<mxGeometry height="38" width="160" x="100" y="135" as="geometry" />
</mxCell>
<mxCell id="md_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="42" width="500" x="100" y="190" as="geometry" />
</mxCell>
<mxCell id="md_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 detected speakers • Ready" vertex="1">
<mxGeometry height="30" width="520" x="100" y="235" as="geometry" />
</mxCell>
<mxCell id="md_edit" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Edit details" vertex="1">
<mxGeometry height="40" width="120" x="1180" y="185" as="geometry" />
</mxCell>
<mxCell id="md_delete" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Delete" vertex="1">
<mxGeometry height="40" width="110" x="1320" y="185" as="geometry" />
</mxCell>
<mxCell id="md_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / Audio Player ▶ 00:18:42 ━━━━━━━━━━━━━━━━━━━ 00:48:05 Volume • Speed 1.0x • Full screen" vertex="1">
<mxGeometry height="230" width="760" x="100" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Meeting information" vertex="1">
<mxGeometry height="30" width="220" x="910" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Title Weekly Product Sync Started Sep 27, 2026 09:00 Ended Sep 27, 2026 09:48 Language English Status Ready" vertex="1">
<mxGeometry height="190" width="520" x="910" y="340" as="geometry" />
</mxCell>
<mxCell id="md_tabs" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Transcript Summary Action items Files" vertex="1">
<mxGeometry height="42" width="1330" x="100" y="575" as="geometry" />
</mxCell>
<mxCell id="md_transcript" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="200" x="100" y="640" as="geometry" />
</mxCell>
<mxCell id="md_search" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Search transcript..." vertex="1">
<mxGeometry height="38" width="300" x="1030" y="635" as="geometry" />
</mxCell>
<mxCell id="md_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export" vertex="1">
<mxGeometry height="38" width="85" x="1345" y="635" as="geometry" />
</mxCell>
<mxCell id="md_t1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:18:41" vertex="1">
<mxGeometry height="28" width="150" x="100" y="690" as="geometry" />
</mxCell>
<mxCell id="md_t1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="38" width="690" x="270" y="686" as="geometry" />
</mxCell>
<mxCell id="md_t2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Bob 00:18:49" vertex="1">
<mxGeometry height="28" width="150" x="100" y="740" as="geometry" />
</mxCell>
<mxCell id="md_t2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="38" width="690" x="270" y="736" as="geometry" />
</mxCell>
<mxCell id="md_t3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:19:02" vertex="1">
<mxGeometry height="28" width="150" x="100" y="790" as="geometry" />
</mxCell>
<mxCell id="md_t3txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Perfect. I&#39;ll prepare the release notes after that." vertex="1">
<mxGeometry height="38" width="690" x="270" y="786" as="geometry" />
</mxCell>
<mxCell id="md_rightsum" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Generated summary" vertex="1">
<mxGeometry height="30" width="190" x="1010" y="690" as="geometry" />
</mxCell>
<mxCell id="md_summary" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration, while Alice prepares release notes." vertex="1">
<mxGeometry height="95" width="420" x="1010" y="730" as="geometry" />
</mxCell>
<mxCell id="md_regen" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Regenerate summary" vertex="1">
<mxGeometry height="38" width="170" x="1010" y="845" as="geometry" />
</mxCell>
<mxCell id="md_reminder" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="38" width="150" x="1195" y="845" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy" vertex="1">
<mxGeometry height="38" width="170" x="140" y="850" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker name" vertex="1">
<mxGeometry height="38" width="150" x="325" y="850" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="settings_full" name="8. Settings - Full">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="sf_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault Settings" vertex="1">
<mxGeometry height="860" width="250" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="General" vertex="1">
<mxGeometry height="42" width="190" x="85" y="150" as="geometry" />
</mxCell>
<mxCell id="sf_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Audio" vertex="1">
<mxGeometry height="42" width="190" x="85" y="205" as="geometry" />
</mxCell>
<mxCell id="sf_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Transcription" vertex="1">
<mxGeometry height="42" width="190" x="85" y="260" as="geometry" />
</mxCell>
<mxCell id="sf_nav4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Overlay" vertex="1">
<mxGeometry height="42" width="190" x="85" y="315" as="geometry" />
</mxCell>
<mxCell id="sf_nav5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Storage &amp; Sync" vertex="1">
<mxGeometry height="42" width="190" x="85" y="370" as="geometry" />
</mxCell>
<mxCell id="sf_nav6" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Account" vertex="1">
<mxGeometry height="42" width="190" x="85" y="425" as="geometry" />
</mxCell>
<mxCell id="sf_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Settings" vertex="1">
<mxGeometry height="40" width="300" x="360" y="90" as="geometry" />
</mxCell>
<mxCell id="sf_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Configure MeetVault desktop behavior and local transcription." vertex="1">
<mxGeometry height="30" width="620" x="360" y="135" as="geometry" />
</mxCell>
<mxCell id="sf_general" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="General" vertex="1">
<mxGeometry height="30" width="180" x="360" y="200" as="geometry" />
</mxCell>
<mxCell id="sf_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="240" as="geometry" />
</mxCell>
<mxCell id="sf_launch" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Launch MeetVault at startup" vertex="1">
<mxGeometry height="38" width="320" x="400" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_tray" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Keep running in system tray" vertex="1">
<mxGeometry height="38" width="320" x="400" y="320" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Global hotkey" vertex="1">
<mxGeometry height="28" width="150" x="780" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Ctrl + Shift + M" vertex="1">
<mxGeometry height="42" width="260" x="780" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_theme_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Theme" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_theme" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="System default ▼" vertex="1">
<mxGeometry height="42" width="260" x="1090" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_audio" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio" vertex="1">
<mxGeometry height="30" width="180" x="360" y="430" as="geometry" />
</mxCell>
<mxCell id="sf_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="160" width="1070" x="360" y="470" as="geometry" />
</mxCell>
<mxCell id="sf_mic_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Microphone" vertex="1">
<mxGeometry height="28" width="160" x="400" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default microphone ▼" vertex="1">
<mxGeometry height="42" width="300" x="400" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_sys_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="System audio" vertex="1">
<mxGeometry height="28" width="160" x="760" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default output ▼" vertex="1">
<mxGeometry height="42" width="300" x="760" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_monitor" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Monitor microphone level" vertex="1">
<mxGeometry height="42" width="250" x="1110" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcription" vertex="1">
<mxGeometry height="30" width="180" x="360" y="675" as="geometry" />
</mxCell>
<mxCell id="sf_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="715" as="geometry" />
</mxCell>
<mxCell id="sf_model_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Model" vertex="1">
<mxGeometry height="28" width="120" x="400" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_model" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Whisper small ▼" vertex="1">
<mxGeometry height="42" width="260" x="400" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_device_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Compute" vertex="1">
<mxGeometry height="28" width="120" x="700" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_device" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="GPU ▼" vertex="1">
<mxGeometry height="42" width="220" x="700" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_lang_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Language" vertex="1">
<mxGeometry height="28" width="120" x="960" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_lang" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Auto detect ▼" vertex="1">
<mxGeometry height="42" width="220" x="960" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_diar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Speaker diarization" vertex="1">
<mxGeometry height="42" width="180" x="1210" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_save" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save changes" vertex="1">
<mxGeometry height="40" width="150" x="1240" y="875" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,384 @@
<mxfile host="Electron" agent="ChatGPT" pages="4">
<diagram id="architecture" name="Architecture Overview">
<mxGraphModel dx="3654" dy="2201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="client_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="USER MACHINE" vertex="1">
<mxGeometry height="720" width="430" x="-150" y="70" as="geometry" />
</mxCell>
<mxCell id="K5FFtGGXxMcr7Zq1do-5-1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="recorder" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="browser" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Browser / Desktop UI React / Next.js" vertex="1">
<mxGeometry height="90" width="170" x="105" y="55" as="geometry" />
</mxCell>
<mxCell id="recorder" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Meeting Recorder WebRTC / MediaRecorder (or native recorder)" vertex="1">
<mxGeometry height="90" width="170" x="105" y="180" as="geometry" />
</mxCell>
<mxCell id="local_tx" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Local Transcription Engine Whisper / whisper.cpp / other local STT Runs on user machine" vertex="1">
<mxGeometry height="120" width="200" x="90" y="330" as="geometry" />
</mxCell>
<mxCell id="local_data" parent="client_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Local temporary data • video/audio chunks • transcript text / segments • timestamps / speakers" vertex="1">
<mxGeometry height="120" width="240" x="70" y="510" as="geometry" />
</mxCell>
<mxCell id="e1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="recorder">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" edge="1" parent="client_zone" source="recorder" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="local_tx">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" edge="1" parent="client_zone" source="local_tx" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="local_data">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="backend_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="YOUR BACKEND / PRIVATE INFRASTRUCTURE" vertex="1">
<mxGeometry height="820" width="1010" x="520" y="-30" as="geometry" />
</mxCell>
<mxCell id="api" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Backend API FastAPI / Node.js Auth • Meetings • Upload URLs Transcript ingestion • Job creation" vertex="1">
<mxGeometry height="150" width="230" x="30" y="160" as="geometry" />
</mxCell>
<mxCell id="pg" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="PostgreSQL users auth_identities subscriptions meetings meeting_files transcripts meeting_tasks meeting_schedules processing_jobs" vertex="1">
<mxGeometry height="170" width="210" x="460" y="190" as="geometry" />
</mxCell>
<mxCell id="seaweed" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="SeaweedFS S3-compatible object storage videos audio thumbnails attachments exports" vertex="1">
<mxGeometry height="100" width="240" x="580" y="60" as="geometry" />
</mxCell>
<mxCell id="queue" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Job Queue Redis / PostgreSQL queue (optional for MVP)" vertex="1">
<mxGeometry height="100" width="200" x="80" y="485" as="geometry" />
</mxCell>
<mxCell id="summary_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Summarization Worker Reads transcript from PostgreSQL Generates summary + action items Writes results back" vertex="1">
<mxGeometry height="150" width="240" x="330" y="460" as="geometry" />
</mxCell>
<mxCell id="reminder_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Reminder Worker / Scheduler Finds due schedules Sends notification / email / webhook Updates execution status" vertex="1">
<mxGeometry height="150" width="240" x="730" y="450" as="geometry" />
</mxCell>
<mxCell id="security_note" parent="backend_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Important: • S3/SeaweedFS credentials stay on backend • Browser uses presigned URLs for large video uploads/downloads • Transcript is uploaded as structured JSON/text after local transcription" vertex="1">
<mxGeometry height="110" width="535" x="390" y="680" as="geometry" />
</mxCell>
<mxCell id="upload_video" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="api" value="HTTPS / request presigned upload">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="460" y="170" />
<mxPoint x="460" y="170" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_pg" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="SQL">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="800" y="200" />
<mxPoint x="800" y="200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_s3" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="seaweed" value="S3 API / presigned URLs">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="665" y="80" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="browser_s3" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="seaweed" value="Direct large-file upload/download">
<mxGeometry relative="1" x="-0.2784" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="200" y="190" />
<mxPoint x="200" y="400" />
<mxPoint x="1270" y="400" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_queue" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="queue" value="enqueue summarization / reminder jobs">
<mxGeometry relative="1" x="-0.4286" y="100" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="690" y="440" />
<mxPoint x="690" y="440" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="queue_sum" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="summary_worker">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="820" y="510" />
<mxPoint x="820" y="510" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="queue_rem" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="reminder_worker">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="700" y="620" />
<mxPoint x="1360" y="620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="sum_pg" edge="1" parent="1" source="summary_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read transcript / write summary &amp; tasks">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1040" y="380" />
<mxPoint x="1040" y="380" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rem_pg" edge="1" parent="1" source="reminder_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read schedules / update status">
<mxGeometry relative="1" x="0.0154" y="-20" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="1150" y="555" />
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="database" name="PostgreSQL Database Design">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="dbtitle" value="PostgreSQL Logical Data Model" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="500" y="20" width="800" height="40" as="geometry" />
</mxCell>
<mxCell id="users" value="users PK id UUID email UNIQUE display_name identification_status account_status created_at updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="100" width="260" height="210" as="geometry" />
</mxCell>
<mxCell id="auth" value="auth_identities PK id UUID FK user_id → users.id provider provider_user_id password_hash created_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="370" width="260" height="190" as="geometry" />
</mxCell>
<mxCell id="subs" value="subscriptions PK id UUID FK user_id → users.id provider plan status current_period_end cancel_at_period_end" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="620" width="260" height="200" as="geometry" />
</mxCell>
<mxCell id="meetings" value="meetings PK id UUID FK owner_user_id → users.id title description started_at / ended_at status summary extra_metadata JSONB created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="410" y="100" width="300" height="250" as="geometry" />
</mxCell>
<mxCell id="files" value="meeting_files PK id UUID FK meeting_id → meetings.id FK uploaded_by → users.id file_type bucket object_key UNIQUE mime_type size_bytes checksum upload_status" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="80" width="310" height="260" as="geometry" />
</mxCell>
<mxCell id="transcripts" value="transcripts PK id UUID FK meeting_id → meetings.id language provider = local plain_text transcript_json JSONB status created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="410" width="310" height="230" as="geometry" />
</mxCell>
<mxCell id="tasks" value="meeting_tasks PK id UUID FK meeting_id → meetings.id FK assigned_user_id → users.id title description due_at status source source_data JSONB" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="80" width="310" height="240" as="geometry" />
</mxCell>
<mxCell id="schedules" value="meeting_schedules PK id UUID FK meeting_id → meetings.id FK user_id → users.id schedule_type scheduled_at status payload JSONB executed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="390" width="310" height="220" as="geometry" />
</mxCell>
<mxCell id="jobs" value="processing_jobs PK id UUID FK meeting_id → meetings.id job_type status attempts error_message input_data JSONB output_data JSONB started_at completed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="720" width="310" height="260" as="geometry" />
</mxCell>
<mxCell id="participants" value="meeting_participants PK id UUID FK meeting_id → meetings.id FK user_id → users.id NULL display_name email role joined_at / left_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="410" y="450" width="300" height="220" as="geometry" />
</mxCell>
<mxCell id="access" value="meeting_access PK id UUID FK meeting_id → meetings.id FK user_id → users.id permission created_at UNIQUE(meeting_id,user_id)" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="700" width="310" height="190" as="geometry" />
</mxCell>
<mxCell id="r1" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="auth">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r2" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="subs">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r3" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="meetings">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r4" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="files">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r5" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="transcripts">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r6" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="tasks">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r7" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="schedules">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r8" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="jobs">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r9" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="participants">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r10" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="access">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r11" value="assigned" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="tasks">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r12" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="schedules">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="dbnote" value="Recommended indexes: • meetings(owner_user_id, started_at DESC) • meeting_files(meeting_id) • transcripts(meeting_id) • meeting_schedules(status, scheduled_at) • processing_jobs(status, created_at) • GIN on transcript_json / extra_metadata only if queried" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="50" y="930" width="660" height="180" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="flows" name="Main Flows">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1700" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ftitle" value="Core Runtime Flows" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="500" y="20" width="700" height="40" as="geometry" />
</mxCell>
<mxCell id="fuser" value="User Machine" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="70" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fapi" value="Backend API" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="420" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fpg" value="PostgreSQL" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="770" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fs3" value="SeaweedFS" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="1120" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fworker" value="Backend Workers" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="1450" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="s1" value="1. Record meeting" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="60" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="s2" value="2. Upload video using presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="180" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s3" value="3. Transcribe locally" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="330" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s4" value="4. Upload transcript JSON/text" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="480" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s5" value="5. View summary / reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="670" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="a1" value="Create meeting Generate presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="90" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="a2" value="Register completed upload" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="240" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="a3" value="Validate + save transcript Create summarization job" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
</mxCell>
<mxCell id="a4" value="Create/update reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="630" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="p1" value="meeting row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="90" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p2" value="meeting_files row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="240" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p3" value="transcripts row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="470" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p4" value="processing_jobs meeting_tasks meeting_schedules" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="630" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="o1" value="video/audio object" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
<mxGeometry x="35" y="190" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="o2" value="attachments / exports" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
<mxGeometry x="35" y="380" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="w1" value="Summarization job → summary → action items" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
</mxCell>
<mxCell id="w2" value="Reminder scheduler → due reminders → send + mark executed" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
<mxGeometry x="35" y="640" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="fx1" value="Create meeting" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s1" target="a1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx2" value="INSERT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a1" target="p1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx3" value="presigned PUT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s2" target="o1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx4" value="upload complete" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s2" target="a2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx5" value="INSERT metadata" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a2" target="p2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx6" value="local only" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s3" target="s4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx7" value="POST transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s4" target="a3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx8" value="INSERT transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="p3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx9" value="enqueue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="w1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx10" value="summary/tasks" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w1" target="p4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx11" value="due schedules" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="p4" target="w2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx12" value="execution status" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w2" target="p4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="storage" name="SeaweedFS Storage Layout">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="stitle" value="SeaweedFS — S3-Compatible Object Layout" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="430" y="20" width="740" height="40" as="geometry" />
</mxCell>
<mxCell id="bucket" value="Bucket: meeting-storage" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="100" width="360" height="120" as="geometry" />
</mxCell>
<mxCell id="userpath" value="users/{user_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="280" width="360" height="80" as="geometry" />
</mxCell>
<mxCell id="meetpath" value="meetings/{meeting_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="420" width="360" height="80" as="geometry" />
</mxCell>
<mxCell id="orig" value="original/ meeting.webm / meeting.mp4" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="210" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="audio" value="audio/ meeting.opus / meeting.wav" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="520" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="thumb" value="thumbnails/ cover.jpg" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="830" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="attach" value="attachments/ agenda.pdf / files" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="1140" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="se1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="bucket" target="userpath">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="se2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="userpath" target="meetpath">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_orig" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="orig">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_audio" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="audio">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_thumb" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="thumb">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_attach" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="attach">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="snote" value="PostgreSQL stores only bucket + object_key + metadata. The video/audio bytes live in SeaweedFS, not PostgreSQL." style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="500" y="810" width="600" height="100" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

828
Overview/README.md Normal file
View File

@@ -0,0 +1,828 @@
# MeetVault
MeetVault is a self-hosted meeting recording and intelligence platform.
The user machine handles meeting recording and local transcription. The backend handles authentication, meeting metadata, transcript ingestion, summarization jobs, task extraction, reminder scheduling, and persistent storage.
Large media files are stored in SeaweedFS through its S3-compatible API, while PostgreSQL stores structured application data.
---
## Architecture Overview
### User Machine
The browser or desktop application is responsible for:
- Recording meeting audio/video
- Running local speech-to-text using Whisper, whisper.cpp, or another local STT engine
- Sending the generated transcript to the backend
- Uploading large media files directly to SeaweedFS using presigned URLs
Local transcription keeps transcription compute and cost on the user's device rather than on the backend.
### Backend Infrastructure
The backend API is responsible for:
- Authentication
- User management
- Meeting management
- Presigned upload URL generation
- Transcript ingestion
- Summarization job creation
- Action-item extraction
- Reminder scheduling
- Job status tracking
PostgreSQL stores structured application data such as users, meetings, transcripts, summaries, tasks, schedules, and processing jobs.
SeaweedFS stores the actual large binary files such as:
- Video
- Audio
- Thumbnails
- Attachments
- Exported files
---
## Data Flow
```text
User machine
│
├── video ─────────────────────────────► SeaweedFS
│
└── local transcript ────────────────► PostgreSQL
│
▼
processing_jobs
│
Summarizer
│
┌─────────────┴─────────────┐
▼ ▼
meeting_tasks meeting_summaries
│
▼
meeting_schedules
│
▼
Reminder Worker
```
---
## Database Design
```text
users
│
├──── auth_identities
│
├──── subscriptions
│
├──── meetings
│ │
│ ├──── meeting_files ─────────► SeaweedFS
│ │
│ ├──── transcripts
│ │
│ ├──── meeting_summaries
│ │
│ ├──── meeting_tasks
│ │ │
│ │ └──── meeting_schedules
│ │
│ └──── processing_jobs
│
└──── meeting_schedules
```
---
# PostgreSQL Schema
## Enable UUID Generation
```sql
CREATE EXTENSION IF NOT EXISTS pgcrypto;
```
---
## Users
```sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(320) UNIQUE NOT NULL,
display_name VARCHAR(255),
identification_status VARCHAR(30)
NOT NULL DEFAULT 'unidentified'
CHECK (
identification_status IN (
'unidentified',
'pending',
'identified',
'rejected'
)
),
account_status VARCHAR(30)
NOT NULL DEFAULT 'active'
CHECK (
account_status IN (
'active',
'suspended',
'disabled'
)
),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
---
## Authentication Identities
Supports local login and external providers such as Google or Microsoft.
```sql
CREATE TABLE auth_identities (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL
REFERENCES users(id)
ON DELETE CASCADE,
provider VARCHAR(50) NOT NULL,
provider_user_id VARCHAR(255),
password_hash TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(provider, provider_user_id)
);
```
Typical providers:
```text
local
google
microsoft
```
---
## Subscriptions
```sql
CREATE TABLE subscriptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL
REFERENCES users(id)
ON DELETE CASCADE,
plan VARCHAR(50)
NOT NULL DEFAULT 'free',
status VARCHAR(30)
NOT NULL DEFAULT 'active'
CHECK (
status IN (
'active',
'trialing',
'past_due',
'cancelled',
'expired'
)
),
provider VARCHAR(50),
provider_customer_id VARCHAR(255),
provider_subscription_id VARCHAR(255),
current_period_start TIMESTAMPTZ,
current_period_end TIMESTAMPTZ,
cancel_at_period_end BOOLEAN
NOT NULL DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
---
## Meetings
```sql
CREATE TABLE meetings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
owner_user_id UUID NOT NULL
REFERENCES users(id)
ON DELETE CASCADE,
title VARCHAR(500),
description TEXT,
started_at TIMESTAMPTZ,
ended_at TIMESTAMPTZ,
timezone VARCHAR(100),
status VARCHAR(30)
NOT NULL DEFAULT 'created'
CHECK (
status IN (
'created',
'recording',
'uploading',
'transcribing',
'processing',
'ready',
'failed',
'archived',
'deleted'
)
),
metadata JSONB NOT NULL DEFAULT '{}',
deleted_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CHECK (
ended_at IS NULL
OR started_at IS NULL
OR ended_at >= started_at
)
);
```
Summaries are stored separately in `meeting_summaries`.
---
## Meeting Files
This table stores file metadata only. The actual media files are stored in SeaweedFS.
```sql
CREATE TABLE meeting_files (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID NOT NULL
REFERENCES meetings(id)
ON DELETE CASCADE,
uploaded_by UUID
REFERENCES users(id)
ON DELETE SET NULL,
file_type VARCHAR(50)
NOT NULL
CHECK (
file_type IN (
'video',
'audio',
'thumbnail',
'attachment',
'export'
)
),
original_filename VARCHAR(500),
mime_type VARCHAR(150),
storage_provider VARCHAR(30)
NOT NULL DEFAULT 'seaweedfs',
storage_bucket VARCHAR(255) NOT NULL,
storage_key TEXT NOT NULL,
size_bytes BIGINT
CHECK (
size_bytes IS NULL
OR size_bytes >= 0
),
checksum VARCHAR(255),
upload_status VARCHAR(30)
NOT NULL DEFAULT 'pending'
CHECK (
upload_status IN (
'pending',
'uploading',
'uploaded',
'failed',
'deleted'
)
),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(storage_provider, storage_bucket, storage_key)
);
```
Example SeaweedFS object path:
```text
meeting-storage/
users/{user_id}/
meetings/{meeting_id}/
original/
recording.webm
```
---
## Transcripts
Transcription happens locally on the user's machine and is uploaded to the backend afterward.
```sql
CREATE TABLE transcripts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID NOT NULL
REFERENCES meetings(id)
ON DELETE CASCADE,
source VARCHAR(30)
NOT NULL DEFAULT 'local'
CHECK (
source IN (
'local',
'imported'
)
),
engine VARCHAR(100),
language VARCHAR(20),
version INTEGER
NOT NULL DEFAULT 1
CHECK (version > 0),
is_active BOOLEAN
NOT NULL DEFAULT TRUE,
plain_text TEXT,
transcript_json JSONB,
duration_seconds NUMERIC(12,2)
CHECK (
duration_seconds IS NULL
OR duration_seconds >= 0
),
status VARCHAR(30)
NOT NULL DEFAULT 'uploaded'
CHECK (
status IN (
'uploaded',
'processing',
'ready',
'failed'
)
),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(meeting_id, version)
);
```
Example transcript JSON:
```json
{
"segments": [
{
"speaker": "Speaker 1",
"start": 4.2,
"end": 9.8,
"text": "Let's review the deployment."
}
]
}
```
---
## Meeting Summaries
```sql
CREATE TABLE meeting_summaries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID NOT NULL
REFERENCES meetings(id)
ON DELETE CASCADE,
summary_type VARCHAR(50)
NOT NULL DEFAULT 'general',
content TEXT NOT NULL,
model VARCHAR(100),
metadata JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
Possible summary types:
```text
general
short
executive
technical
action-focused
```
---
## Meeting Tasks
```sql
CREATE TABLE meeting_tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID NOT NULL
REFERENCES meetings(id)
ON DELETE CASCADE,
assigned_user_id UUID
REFERENCES users(id)
ON DELETE SET NULL,
title VARCHAR(500) NOT NULL,
description TEXT,
due_at TIMESTAMPTZ,
status VARCHAR(30)
NOT NULL DEFAULT 'open'
CHECK (
status IN (
'open',
'in_progress',
'completed',
'cancelled'
)
),
source VARCHAR(30)
NOT NULL DEFAULT 'ai'
CHECK (
source IN (
'ai',
'manual',
'imported'
)
),
source_metadata JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
---
## Meeting Schedules / Reminders
```sql
CREATE TABLE meeting_schedules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID NOT NULL
REFERENCES meetings(id)
ON DELETE CASCADE,
task_id UUID
REFERENCES meeting_tasks(id)
ON DELETE CASCADE,
user_id UUID NOT NULL
REFERENCES users(id)
ON DELETE CASCADE,
schedule_type VARCHAR(50) NOT NULL,
scheduled_at TIMESTAMPTZ NOT NULL,
status VARCHAR(30)
NOT NULL DEFAULT 'pending'
CHECK (
status IN (
'pending',
'processing',
'executed',
'failed',
'cancelled'
)
),
payload JSONB NOT NULL DEFAULT '{}',
executed_at TIMESTAMPTZ,
attempts INTEGER
NOT NULL DEFAULT 0,
last_error TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
Example reminder payload:
```json
{
"channel": "email",
"message": "Prepare the deployment report"
}
```
---
## Processing Jobs
MeetVault can use PostgreSQL itself as the first job queue.
```sql
CREATE TABLE processing_jobs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
meeting_id UUID
REFERENCES meetings(id)
ON DELETE CASCADE,
job_type VARCHAR(50)
NOT NULL
CHECK (
job_type IN (
'summarize_meeting',
'extract_action_items',
'generate_reminders'
)
),
status VARCHAR(30)
NOT NULL DEFAULT 'queued'
CHECK (
status IN (
'queued',
'running',
'completed',
'failed',
'cancelled'
)
),
priority SMALLINT
NOT NULL DEFAULT 0,
attempts INTEGER
NOT NULL DEFAULT 0,
max_attempts INTEGER
NOT NULL DEFAULT 3
CHECK (max_attempts > 0),
input_data JSONB,
output_data JSONB,
error_message TEXT,
available_at TIMESTAMPTZ
NOT NULL DEFAULT NOW(),
locked_at TIMESTAMPTZ,
locked_by VARCHAR(255),
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
Example job pickup query:
```sql
SELECT *
FROM processing_jobs
WHERE status = 'queued'
AND available_at <= NOW()
ORDER BY priority DESC, created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;
```
This allows multiple workers without two workers processing the same job.
Redis or another dedicated queue can be added later if required.
---
# Indexes
```sql
CREATE INDEX idx_meetings_owner
ON meetings(owner_user_id);
CREATE INDEX idx_meetings_owner_started
ON meetings(owner_user_id, started_at DESC);
CREATE INDEX idx_meetings_status
ON meetings(status);
CREATE INDEX idx_meeting_files_meeting
ON meeting_files(meeting_id);
CREATE INDEX idx_transcripts_meeting
ON transcripts(meeting_id);
CREATE INDEX idx_transcripts_active
ON transcripts(meeting_id, is_active);
CREATE INDEX idx_summaries_meeting
ON meeting_summaries(meeting_id);
CREATE INDEX idx_tasks_meeting
ON meeting_tasks(meeting_id);
CREATE INDEX idx_tasks_assigned_user
ON meeting_tasks(assigned_user_id);
CREATE INDEX idx_schedules_due
ON meeting_schedules(status, scheduled_at);
CREATE INDEX idx_processing_jobs_queue
ON processing_jobs(status, available_at, priority DESC);
```
The most important worker indexes are:
```text
meeting_schedules(status, scheduled_at)
processing_jobs(status, available_at, priority)
```
---
# Automatic `updated_at`
PostgreSQL does not automatically modify `updated_at` when a row changes.
Create a shared trigger function:
```sql
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
```
Apply it to relevant tables:
```sql
CREATE TRIGGER trg_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TRIGGER trg_subscriptions_updated_at
BEFORE UPDATE ON subscriptions
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TRIGGER trg_meetings_updated_at
BEFORE UPDATE ON meetings
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TRIGGER trg_transcripts_updated_at
BEFORE UPDATE ON transcripts
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TRIGGER trg_tasks_updated_at
BEFORE UPDATE ON meeting_tasks
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TRIGGER trg_schedules_updated_at
BEFORE UPDATE ON meeting_schedules
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
```
---
# Final Architecture
```text
MeetVault
USER MACHINE
│
┌──────────┴──────────┐
│ │
Recording Local STT
│ Whisper
│ │
▼ ▼
Video/audio Transcript
│ │
│ ▼
│ Backend API
│ │
│ ▼
│ PostgreSQL
│ │
│ processing_jobs
│ │
│ ▼
│ Summary Worker
│ / \
│ / \
▼ ▼ ▼
SeaweedFS meeting_tasks summaries
│
▼
meeting_schedules
│
▼
Reminder Worker
```
---
# Recommended MVP Stack
A practical first implementation could use:
```text
Frontend
React / Next.js
Backend
FastAPI or Node.js
Database
PostgreSQL
Media Storage
SeaweedFS
Local Transcription
Whisper / whisper.cpp
Backend Jobs
PostgreSQL processing_jobs
Workers
Summarization Worker
Reminder Worker
```
For the first version, MeetVault does not require:
- Kafka
- Elasticsearch
- Kubernetes
- A vector database
- A separate microservice architecture
- Redis, unless job volume grows enough to justify it
PostgreSQL + SeaweedFS + the backend API + workers is sufficient for the MVP and leaves room to scale later.

View File

@@ -0,0 +1,385 @@
<mxfile host="Electron" agent="ChatGPT" pages="4">
<diagram id="architecture" name="Architecture Overview">
<mxGraphModel dx="1712" dy="1001" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="client_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="USER MACHINE" vertex="1">
<mxGeometry height="720" width="430" x="30" y="80" as="geometry" />
</mxCell>
<mxCell id="K5FFtGGXxMcr7Zq1do-5-1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="recorder" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="browser" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Browser / Desktop UI React / Next.js" vertex="1">
<mxGeometry height="90" width="170" x="105" y="55" as="geometry" />
</mxCell>
<mxCell id="recorder" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Meeting Recorder WebRTC / MediaRecorder (or native recorder)" vertex="1">
<mxGeometry height="90" width="170" x="105" y="180" as="geometry" />
</mxCell>
<mxCell id="local_tx" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Local Transcription Engine Whisper / whisper.cpp / other local STT Runs on user machine" vertex="1">
<mxGeometry height="120" width="200" x="90" y="330" as="geometry" />
</mxCell>
<mxCell id="local_data" parent="client_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Local temporary data • video/audio chunks • transcript text / segments • timestamps / speakers" vertex="1">
<mxGeometry height="120" width="240" x="70" y="510" as="geometry" />
</mxCell>
<mxCell id="e1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="recorder">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" edge="1" parent="client_zone" source="recorder" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="local_tx">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" edge="1" parent="client_zone" source="local_tx" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="local_data">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="backend_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="YOUR BACKEND / PRIVATE INFRASTRUCTURE" vertex="1">
<mxGeometry height="820" width="1010" x="560" y="10" as="geometry" />
</mxCell>
<mxCell id="api" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Backend API FastAPI / Node.js Auth • Meetings • Upload URLs Transcript ingestion • Job creation" vertex="1">
<mxGeometry height="150" width="230" x="30" y="160" as="geometry" />
</mxCell>
<mxCell id="pg" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="PostgreSQL users auth_identities subscriptions meetings meeting_files transcripts meeting_tasks meeting_schedules processing_jobs" vertex="1">
<mxGeometry height="170" width="210" x="460" y="190" as="geometry" />
</mxCell>
<mxCell id="seaweed" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="SeaweedFS S3-compatible object storage videos audio thumbnails attachments exports" vertex="1">
<mxGeometry height="100" width="240" x="580" y="60" as="geometry" />
</mxCell>
<mxCell id="queue" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Job Queue Redis / PostgreSQL queue (optional for MVP)" vertex="1">
<mxGeometry height="100" width="200" x="80" y="485" as="geometry" />
</mxCell>
<mxCell id="summary_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Summarization Worker Reads transcript from PostgreSQL Generates summary + action items Writes results back" vertex="1">
<mxGeometry height="150" width="240" x="330" y="460" as="geometry" />
</mxCell>
<mxCell id="reminder_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Reminder Worker / Scheduler Finds due schedules Sends notification / email / webhook Updates execution status" vertex="1">
<mxGeometry height="150" width="240" x="730" y="450" as="geometry" />
</mxCell>
<mxCell id="security_note" parent="backend_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Important: • S3/SeaweedFS credentials stay on backend • Browser uses presigned URLs for large video uploads/downloads • Transcript is uploaded as structured JSON/text after local transcription" vertex="1">
<mxGeometry height="110" width="535" x="390" y="680" as="geometry" />
</mxCell>
<mxCell id="upload_video" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="api" value="HTTPS / request presigned upload">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="200" />
<mxPoint x="360" y="200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_pg" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="SQL">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="800" y="200" />
<mxPoint x="800" y="200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_s3" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="seaweed" value="S3 API / presigned URLs">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="665" y="80" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="browser_s3" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="seaweed" value="Direct large-file upload/download">
<mxGeometry relative="1" x="-0.2784" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="280" y="230" />
<mxPoint x="330" y="230" />
<mxPoint x="330" y="400" />
<mxPoint x="1270" y="400" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="api_queue" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="queue" value="enqueue summarization / reminder jobs">
<mxGeometry relative="1" x="-0.4286" y="100" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="690" y="440" />
<mxPoint x="690" y="440" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="queue_sum" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="summary_worker">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="820" y="510" />
<mxPoint x="820" y="510" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="queue_rem" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="reminder_worker">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="700" y="620" />
<mxPoint x="1360" y="620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="sum_pg" edge="1" parent="1" source="summary_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read transcript / write summary &amp; tasks">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1040" y="380" />
<mxPoint x="1040" y="380" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rem_pg" edge="1" parent="1" source="reminder_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read schedules / update status">
<mxGeometry relative="1" x="0.0154" y="-20" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="1150" y="555" />
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="database" name="PostgreSQL Database Design">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="dbtitle" value="PostgreSQL Logical Data Model" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="500" y="20" width="800" height="40" as="geometry" />
</mxCell>
<mxCell id="users" value="users PK id UUID email UNIQUE display_name identification_status account_status created_at updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="100" width="260" height="210" as="geometry" />
</mxCell>
<mxCell id="auth" value="auth_identities PK id UUID FK user_id → users.id provider provider_user_id password_hash created_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="370" width="260" height="190" as="geometry" />
</mxCell>
<mxCell id="subs" value="subscriptions PK id UUID FK user_id → users.id provider plan status current_period_end cancel_at_period_end" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="50" y="620" width="260" height="200" as="geometry" />
</mxCell>
<mxCell id="meetings" value="meetings PK id UUID FK owner_user_id → users.id title description started_at / ended_at status summary extra_metadata JSONB created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="410" y="100" width="300" height="250" as="geometry" />
</mxCell>
<mxCell id="files" value="meeting_files PK id UUID FK meeting_id → meetings.id FK uploaded_by → users.id file_type bucket object_key UNIQUE mime_type size_bytes checksum upload_status" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="80" width="310" height="260" as="geometry" />
</mxCell>
<mxCell id="transcripts" value="transcripts PK id UUID FK meeting_id → meetings.id language provider = local plain_text transcript_json JSONB status created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="410" width="310" height="230" as="geometry" />
</mxCell>
<mxCell id="tasks" value="meeting_tasks PK id UUID FK meeting_id → meetings.id FK assigned_user_id → users.id title description due_at status source source_data JSONB" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="80" width="310" height="240" as="geometry" />
</mxCell>
<mxCell id="schedules" value="meeting_schedules PK id UUID FK meeting_id → meetings.id FK user_id → users.id schedule_type scheduled_at status payload JSONB executed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="390" width="310" height="220" as="geometry" />
</mxCell>
<mxCell id="jobs" value="processing_jobs PK id UUID FK meeting_id → meetings.id job_type status attempts error_message input_data JSONB output_data JSONB started_at completed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="800" y="720" width="310" height="260" as="geometry" />
</mxCell>
<mxCell id="participants" value="meeting_participants PK id UUID FK meeting_id → meetings.id FK user_id → users.id NULL display_name email role joined_at / left_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="410" y="450" width="300" height="220" as="geometry" />
</mxCell>
<mxCell id="access" value="meeting_access PK id UUID FK meeting_id → meetings.id FK user_id → users.id permission created_at UNIQUE(meeting_id,user_id)" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
<mxGeometry x="1200" y="700" width="310" height="190" as="geometry" />
</mxCell>
<mxCell id="r1" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="auth">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r2" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="subs">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r3" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="meetings">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r4" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="files">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r5" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="transcripts">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r6" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="tasks">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r7" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="schedules">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r8" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="jobs">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r9" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="participants">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r10" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="access">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r11" value="assigned" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="tasks">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="r12" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="schedules">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="dbnote" value="Recommended indexes: • meetings(owner_user_id, started_at DESC) • meeting_files(meeting_id) • transcripts(meeting_id) • meeting_schedules(status, scheduled_at) • processing_jobs(status, created_at) • GIN on transcript_json / extra_metadata only if queried" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="50" y="930" width="660" height="180" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="flows" name="Main Flows">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1700" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ftitle" value="Core Runtime Flows" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="500" y="20" width="700" height="40" as="geometry" />
</mxCell>
<mxCell id="fuser" value="User Machine" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="70" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fapi" value="Backend API" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="420" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fpg" value="PostgreSQL" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="770" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fs3" value="SeaweedFS" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="1120" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="fworker" value="Backend Workers" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="1450" y="90" width="250" height="870" as="geometry" />
</mxCell>
<mxCell id="s1" value="1. Record meeting" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="60" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="s2" value="2. Upload video using presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="180" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s3" value="3. Transcribe locally" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="330" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s4" value="4. Upload transcript JSON/text" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="480" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="s5" value="5. View summary / reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
<mxGeometry x="30" y="670" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="a1" value="Create meeting Generate presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="90" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="a2" value="Register completed upload" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="240" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="a3" value="Validate + save transcript Create summarization job" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
</mxCell>
<mxCell id="a4" value="Create/update reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
<mxGeometry x="35" y="630" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="p1" value="meeting row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="90" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p2" value="meeting_files row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="240" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p3" value="transcripts row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="470" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="p4" value="processing_jobs meeting_tasks meeting_schedules" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
<mxGeometry x="35" y="630" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="o1" value="video/audio object" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
<mxGeometry x="35" y="190" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="o2" value="attachments / exports" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
<mxGeometry x="35" y="380" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="w1" value="Summarization job → summary → action items" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
</mxCell>
<mxCell id="w2" value="Reminder scheduler → due reminders → send + mark executed" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
<mxGeometry x="35" y="640" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="fx1" value="Create meeting" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s1" target="a1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx2" value="INSERT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a1" target="p1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx3" value="presigned PUT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s2" target="o1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx4" value="upload complete" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s2" target="a2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx5" value="INSERT metadata" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a2" target="p2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx6" value="local only" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s3" target="s4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx7" value="POST transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s4" target="a3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx8" value="INSERT transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="p3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx9" value="enqueue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="w1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx10" value="summary/tasks" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w1" target="p4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx11" value="due schedules" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="p4" target="w2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fx12" value="execution status" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w2" target="p4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="storage" name="SeaweedFS Storage Layout">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="stitle" value="SeaweedFS — S3-Compatible Object Layout" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="430" y="20" width="740" height="40" as="geometry" />
</mxCell>
<mxCell id="bucket" value="Bucket: meeting-storage" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="100" width="360" height="120" as="geometry" />
</mxCell>
<mxCell id="userpath" value="users/{user_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="280" width="360" height="80" as="geometry" />
</mxCell>
<mxCell id="meetpath" value="meetings/{meeting_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="620" y="420" width="360" height="80" as="geometry" />
</mxCell>
<mxCell id="orig" value="original/ meeting.webm / meeting.mp4" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="210" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="audio" value="audio/ meeting.opus / meeting.wav" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="520" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="thumb" value="thumbnails/ cover.jpg" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="830" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="attach" value="attachments/ agenda.pdf / files" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="1140" y="620" width="250" height="100" as="geometry" />
</mxCell>
<mxCell id="se1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="bucket" target="userpath">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="se2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="userpath" target="meetpath">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_orig" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="orig">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_audio" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="audio">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_thumb" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="thumb">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_attach" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="attach">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="snote" value="PostgreSQL stores only bucket + object_key + metadata. The video/audio bytes live in SeaweedFS, not PostgreSQL." style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="500" y="810" width="600" height="100" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

0
Readme.md Normal file
View File

View File

@@ -0,0 +1,577 @@
<mxfile host="Electron" agent="ChatGPT" pages="7">
<diagram id="dashboard" name="1. Dashboard">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="d_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault" vertex="1">
<mxGeometry height="860" width="230" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="⌂ Dashboard" vertex="1">
<mxGeometry height="44" width="180" x="85" y="130" as="geometry" />
</mxCell>
<mxCell id="d_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="◷ Meetings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="190" as="geometry" />
</mxCell>
<mxCell id="d_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="⚙ Settings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="250" as="geometry" />
</mxCell>
<mxCell id="d_user" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Signed in as alex@example.com" vertex="1">
<mxGeometry height="70" width="180" x="85" y="800" as="geometry" />
</mxCell>
<mxCell id="d_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Good morning" vertex="1">
<mxGeometry height="40" width="420" x="340" y="90" as="geometry" />
</mxCell>
<mxCell id="d_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Record, transcribe, summarize, and follow up on meetings." vertex="1">
<mxGeometry height="30" width="560" x="340" y="135" as="geometry" />
</mxCell>
<mxCell id="d_start" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="+ Start new meeting" vertex="1">
<mxGeometry height="48" width="250" x="1210" y="90" as="geometry" />
</mxCell>
<mxCell id="d_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="340" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card1h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Quick start" vertex="1">
<mxGeometry height="30" width="180" x="365" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card1b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Microphone: Default System&amp;nbsp;&lt;div&gt;audio: On Local STT: Whisper small&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="360" y="290" as="geometry" />
</mxCell>
<mxCell id="d_card1btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Start recording" vertex="1">
<mxGeometry height="38" width="160" x="365" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="720" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card2h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live overlay" vertex="1">
<mxGeometry height="30" width="180" x="745" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card2b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Overlay: Enabled&amp;nbsp;&lt;div&gt;Position: Bottom center&amp;nbsp;&lt;/div&gt;&lt;div&gt;Speaker labels: On&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="745" y="280" as="geometry" />
</mxCell>
<mxCell id="d_card2btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Preview overlay" vertex="1">
<mxGeometry height="38" width="170" x="745" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="360" x="1100" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card3h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Storage" vertex="1">
<mxGeometry height="30" width="180" x="1125" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card3b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="SeaweedFS connected&amp;nbsp;&lt;div&gt;Storage used: 12.8 GB Uploads: healthy&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="1125" y="290" as="geometry" />
</mxCell>
<mxCell id="d_storagechip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Connected" vertex="1">
<mxGeometry height="26" width="110" x="1270" y="245" as="geometry" />
</mxCell>
<mxCell id="d_recenth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Recent meetings" vertex="1">
<mxGeometry height="30" width="220" x="340" y="455" as="geometry" />
</mxCell>
<mxCell id="d_table" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="300" width="1120" x="340" y="500" as="geometry" />
</mxCell>
<mxCell id="d_th0" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Title" vertex="1">
<mxGeometry height="28" width="230" x="360" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Date" vertex="1">
<mxGeometry height="28" width="140" x="760" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Duration" vertex="1">
<mxGeometry height="28" width="120" x="930" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th3" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Status" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th4" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Actions" vertex="1">
<mxGeometry height="28" width="140" x="1270" y="515" as="geometry" />
</mxCell>
<mxCell id="d_r0t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="34" width="340" x="360" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="48 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="558" as="geometry" />
</mxCell>
<mxCell id="d_r0a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="557" as="geometry" />
</mxCell>
<mxCell id="d_r1t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Backend Architecture Review" vertex="1">
<mxGeometry height="34" width="340" x="360" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 26, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="61 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="628" as="geometry" />
</mxCell>
<mxCell id="d_r1a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="627" as="geometry" />
</mxCell>
<mxCell id="d_r2t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Client Planning Call" vertex="1">
<mxGeometry height="34" width="340" x="360" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 25, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="35 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Processing" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="698" as="geometry" />
</mxCell>
<mxCell id="d_r2a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="697" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="live" name="2. Live Meeting">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="l_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="l_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault • Live Meeting" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="l_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="l_timer" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="● REC 00:18:42" vertex="1">
<mxGeometry height="40" width="200" x="1260" y="140" as="geometry" />
</mxCell>
<mxCell id="l_left" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="860" x="100" y="210" as="geometry" />
</mxCell>
<mxCell id="l_transh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live transcription" vertex="1">
<mxGeometry height="30" width="240" x="125" y="235" as="geometry" />
</mxCell>
<mxCell id="l_s1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="290" as="geometry" />
</mxCell>
<mxCell id="l_s1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the upload flow before Friday." vertex="1">
<mxGeometry height="42" width="630" x="250" y="285" as="geometry" />
</mxCell>
<mxCell id="l_s2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="125" y="360" as="geometry" />
</mxCell>
<mxCell id="l_s2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I can take the SeaweedFS integration and the presigned URL endpoint." vertex="1">
<mxGeometry height="54" width="630" x="250" y="355" as="geometry" />
</mxCell>
<mxCell id="l_s1b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="435" as="geometry" />
</mxCell>
<mxCell id="l_s1btxt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Great. I will handle the meeting job queue and reminders." vertex="1">
<mxGeometry height="54" width="630" x="250" y="430" as="geometry" />
</mxCell>
<mxCell id="l_partial" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Speaker 2 • listening…" vertex="1">
<mxGeometry height="48" width="760" x="125" y="525" as="geometry" />
</mxCell>
<mxCell id="l_wave" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="▁▃▅▆▅▃▂▁▂▅▇▆▃▂▁" vertex="1">
<mxGeometry height="40" width="760" x="125" y="600" as="geometry" />
</mxCell>
<mxCell id="l_controls" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Pause" vertex="1">
<mxGeometry height="40" width="110" x="125" y="690" as="geometry" />
</mxCell>
<mxCell id="l_overlaybtn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Show overlay" vertex="1">
<mxGeometry height="40" width="150" x="250" y="690" as="geometry" />
</mxCell>
<mxCell id="l_finish" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Finish meeting" vertex="1">
<mxGeometry height="40" width="160" x="725" y="690" as="geometry" />
</mxCell>
<mxCell id="l_right" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="460" x="1000" y="210" as="geometry" />
</mxCell>
<mxCell id="l_speakersh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Speakers" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="235" as="geometry" />
</mxCell>
<mxCell id="l_sp1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 1" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="285" as="geometry" />
</mxCell>
<mxCell id="l_rename1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="285" as="geometry" />
</mxCell>
<mxCell id="l_sp2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 2" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="345" as="geometry" />
</mxCell>
<mxCell id="l_rename2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="345" as="geometry" />
</mxCell>
<mxCell id="l_audioh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio sources" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="435" as="geometry" />
</mxCell>
<mxCell id="l_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Microphone" vertex="1">
<mxGeometry height="38" width="180" x="1025" y="480" as="geometry" />
</mxCell>
<mxCell id="l_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ System audio" vertex="1">
<mxGeometry height="38" width="190" x="1220" y="480" as="geometry" />
</mxCell>
<mxCell id="l_stth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Local transcription" vertex="1">
<mxGeometry height="30" width="220" x="1025" y="555" as="geometry" />
</mxCell>
<mxCell id="l_stt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Whisper small Device: GPU Latency: ~1.2 s" vertex="1">
<mxGeometry height="90" width="260" x="1025" y="595" as="geometry" />
</mxCell>
<mxCell id="l_sttchip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Healthy" vertex="1">
<mxGeometry height="28" width="100" x="1300" y="610" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="overlay" name="3. Live Overlay">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="o_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Desktop / meeting app background" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="o_fakeapp" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video conference / presentation area" vertex="1">
<mxGeometry height="600" width="1100" x="250" y="130" as="geometry" />
</mxCell>
<mxCell id="o_toolbar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault overlay controls" vertex="1">
<mxGeometry height="42" width="320" x="1030" y="90" as="geometry" />
</mxCell>
<mxCell id="o_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#374151;fontColor=#ffffff;opacity=92;" vertex="1">
<mxGeometry height="190" width="820" x="390" y="590" as="geometry" />
</mxCell>
<mxCell id="o_sp1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#93c5fd;" value="Alice" vertex="1">
<mxGeometry height="28" width="100" x="425" y="620" as="geometry" />
</mxCell>
<mxCell id="o_txt1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="40" width="720" x="425" y="650" as="geometry" />
</mxCell>
<mxCell id="o_sp2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#86efac;" value="Bob" vertex="1">
<mxGeometry height="28" width="100" x="425" y="700" as="geometry" />
</mxCell>
<mxCell id="o_txt2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="40" width="720" x="425" y="730" as="geometry" />
</mxCell>
<mxCell id="o_hint" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Overlay options: drag • resize • opacity • font size • click-through • show/hide speaker labels" vertex="1">
<mxGeometry height="30" width="820" x="390" y="805" as="geometry" />
</mxCell>
<mxCell id="6jg8ZA6zPTfZGke1Gjl6-1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;Click the speaker&#39;s name to rename&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="720" x="410" y="580" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="speaker" name="4. Rename Speakers">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="s_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Live meeting screen (dimmed)" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="s_modal" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="600" width="660" x="470" y="160" as="geometry" />
</mxCell>
<mxCell id="s_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Rename speakers" vertex="1">
<mxGeometry height="40" width="300" x="510" y="200" as="geometry" />
</mxCell>
<mxCell id="s_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Speaker labels are local to this meeting. Rename them anytime during the session." vertex="1">
<mxGeometry height="40" width="520" x="510" y="245" as="geometry" />
</mxCell>
<mxCell id="s_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="320" as="geometry" />
</mxCell>
<mxCell id="s_label1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="535" y="342" as="geometry" />
</mxCell>
<mxCell id="s_input1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Alice" vertex="1">
<mxGeometry height="42" width="360" x="535" y="382" as="geometry" />
</mxCell>
<mxCell id="s_save1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="382" as="geometry" />
</mxCell>
<mxCell id="s_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="470" as="geometry" />
</mxCell>
<mxCell id="s_label2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="535" y="492" as="geometry" />
</mxCell>
<mxCell id="s_input2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Bob" vertex="1">
<mxGeometry height="42" width="360" x="535" y="532" as="geometry" />
</mxCell>
<mxCell id="s_save2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="532" as="geometry" />
</mxCell>
<mxCell id="s_note" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Tip: if diarization temporarily swaps speakers, you can reassign the latest segment from the transcript view." vertex="1">
<mxGeometry height="60" width="540" x="510" y="630" as="geometry" />
</mxCell>
<mxCell id="s_close" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Close" vertex="1">
<mxGeometry height="42" width="150" x="900" y="690" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="review" name="6. Meeting Review">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="r_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="r_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault / Weekly Product Sync" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="r_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="r_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 speakers" vertex="1">
<mxGeometry height="30" width="420" x="100" y="185" as="geometry" />
</mxCell>
<mxCell id="r_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / audio player 00:18:42 / 00:48:05" vertex="1">
<mxGeometry height="220" width="700" x="100" y="240" as="geometry" />
</mxCell>
<mxCell id="r_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="180" x="100" y="510" as="geometry" />
</mxCell>
<mxCell id="r_tbox" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Alice 00:18:41 We should finalize the API contract before tomorrow. Bob 00:18:49 I will update the database migration tonight. Alice 00:19:02 Perfect, then I&#39;ll prepare the release notes." vertex="1">
<mxGeometry height="260" width="700" x="100" y="550" as="geometry" />
</mxCell>
<mxCell id="r_sumh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Summary" vertex="1">
<mxGeometry height="30" width="200" x="850" y="240" as="geometry" />
</mxCell>
<mxCell id="r_sum" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration tonight, while Alice prepares the release notes." vertex="1">
<mxGeometry height="140" width="590" x="850" y="280" as="geometry" />
</mxCell>
<mxCell id="r_taskh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Action items" vertex="1">
<mxGeometry height="30" width="200" x="850" y="465" as="geometry" />
</mxCell>
<mxCell id="r_task1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Update database migration Bob • Due tonight" vertex="1">
<mxGeometry height="70" width="590" x="850" y="505" as="geometry" />
</mxCell>
<mxCell id="r_task2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Prepare release notes Alice • Due tomorrow" vertex="1">
<mxGeometry height="70" width="590" x="850" y="590" as="geometry" />
</mxCell>
<mxCell id="r_rem" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="42" width="180" x="850" y="705" as="geometry" />
</mxCell>
<mxCell id="r_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export transcript" vertex="1">
<mxGeometry height="42" width="180" x="1050" y="705" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker&#39;s name" vertex="1">
<mxGeometry height="42" width="180" x="420" y="505" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy transcript" vertex="1">
<mxGeometry height="42" width="180" x="620" y="505" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="meeting_details" name="7. Meeting Details">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="md_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="md_top" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault / Meetings / Weekly Product Sync" vertex="1">
<mxGeometry height="60" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="md_back" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="← Back to meetings" vertex="1">
<mxGeometry height="38" width="160" x="100" y="135" as="geometry" />
</mxCell>
<mxCell id="md_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="42" width="500" x="100" y="190" as="geometry" />
</mxCell>
<mxCell id="md_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 detected speakers • Ready" vertex="1">
<mxGeometry height="30" width="520" x="100" y="235" as="geometry" />
</mxCell>
<mxCell id="md_edit" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Edit details" vertex="1">
<mxGeometry height="40" width="120" x="1180" y="185" as="geometry" />
</mxCell>
<mxCell id="md_delete" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Delete" vertex="1">
<mxGeometry height="40" width="110" x="1320" y="185" as="geometry" />
</mxCell>
<mxCell id="md_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / Audio Player ▶ 00:18:42 ━━━━━━━━━━━━━━━━━━━ 00:48:05 Volume • Speed 1.0x • Full screen" vertex="1">
<mxGeometry height="230" width="760" x="100" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Meeting information" vertex="1">
<mxGeometry height="30" width="220" x="910" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Title Weekly Product Sync Started Sep 27, 2026 09:00 Ended Sep 27, 2026 09:48 Language English Status Ready" vertex="1">
<mxGeometry height="190" width="520" x="910" y="340" as="geometry" />
</mxCell>
<mxCell id="md_tabs" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Transcript Summary Action items Files" vertex="1">
<mxGeometry height="42" width="1330" x="100" y="575" as="geometry" />
</mxCell>
<mxCell id="md_transcript" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="200" x="100" y="640" as="geometry" />
</mxCell>
<mxCell id="md_search" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Search transcript..." vertex="1">
<mxGeometry height="38" width="300" x="1030" y="635" as="geometry" />
</mxCell>
<mxCell id="md_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export" vertex="1">
<mxGeometry height="38" width="85" x="1345" y="635" as="geometry" />
</mxCell>
<mxCell id="md_t1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:18:41" vertex="1">
<mxGeometry height="28" width="150" x="100" y="690" as="geometry" />
</mxCell>
<mxCell id="md_t1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="38" width="690" x="270" y="686" as="geometry" />
</mxCell>
<mxCell id="md_t2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Bob 00:18:49" vertex="1">
<mxGeometry height="28" width="150" x="100" y="740" as="geometry" />
</mxCell>
<mxCell id="md_t2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="38" width="690" x="270" y="736" as="geometry" />
</mxCell>
<mxCell id="md_t3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:19:02" vertex="1">
<mxGeometry height="28" width="150" x="100" y="790" as="geometry" />
</mxCell>
<mxCell id="md_t3txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Perfect. I&#39;ll prepare the release notes after that." vertex="1">
<mxGeometry height="38" width="690" x="270" y="786" as="geometry" />
</mxCell>
<mxCell id="md_rightsum" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Generated summary" vertex="1">
<mxGeometry height="30" width="190" x="1010" y="690" as="geometry" />
</mxCell>
<mxCell id="md_summary" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration, while Alice prepares release notes." vertex="1">
<mxGeometry height="95" width="420" x="1010" y="730" as="geometry" />
</mxCell>
<mxCell id="md_regen" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Regenerate summary" vertex="1">
<mxGeometry height="38" width="170" x="1010" y="845" as="geometry" />
</mxCell>
<mxCell id="md_reminder" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="38" width="150" x="1195" y="845" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy" vertex="1">
<mxGeometry height="38" width="170" x="140" y="850" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker name" vertex="1">
<mxGeometry height="38" width="150" x="325" y="850" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="settings_full" name="8. Settings - Full">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="sf_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault Settings" vertex="1">
<mxGeometry height="860" width="250" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="General" vertex="1">
<mxGeometry height="42" width="190" x="85" y="150" as="geometry" />
</mxCell>
<mxCell id="sf_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Audio" vertex="1">
<mxGeometry height="42" width="190" x="85" y="205" as="geometry" />
</mxCell>
<mxCell id="sf_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Transcription" vertex="1">
<mxGeometry height="42" width="190" x="85" y="260" as="geometry" />
</mxCell>
<mxCell id="sf_nav4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Overlay" vertex="1">
<mxGeometry height="42" width="190" x="85" y="315" as="geometry" />
</mxCell>
<mxCell id="sf_nav5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Storage &amp; Sync" vertex="1">
<mxGeometry height="42" width="190" x="85" y="370" as="geometry" />
</mxCell>
<mxCell id="sf_nav6" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Account" vertex="1">
<mxGeometry height="42" width="190" x="85" y="425" as="geometry" />
</mxCell>
<mxCell id="sf_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Settings" vertex="1">
<mxGeometry height="40" width="300" x="360" y="90" as="geometry" />
</mxCell>
<mxCell id="sf_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Configure MeetVault desktop behavior and local transcription." vertex="1">
<mxGeometry height="30" width="620" x="360" y="135" as="geometry" />
</mxCell>
<mxCell id="sf_general" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="General" vertex="1">
<mxGeometry height="30" width="180" x="360" y="200" as="geometry" />
</mxCell>
<mxCell id="sf_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="240" as="geometry" />
</mxCell>
<mxCell id="sf_launch" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Launch MeetVault at startup" vertex="1">
<mxGeometry height="38" width="320" x="400" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_tray" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Keep running in system tray" vertex="1">
<mxGeometry height="38" width="320" x="400" y="320" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Global hotkey" vertex="1">
<mxGeometry height="28" width="150" x="780" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Ctrl + Shift + M" vertex="1">
<mxGeometry height="42" width="260" x="780" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_theme_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Theme" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_theme" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="System default ▼" vertex="1">
<mxGeometry height="42" width="260" x="1090" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_audio" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio" vertex="1">
<mxGeometry height="30" width="180" x="360" y="430" as="geometry" />
</mxCell>
<mxCell id="sf_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="160" width="1070" x="360" y="470" as="geometry" />
</mxCell>
<mxCell id="sf_mic_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Microphone" vertex="1">
<mxGeometry height="28" width="160" x="400" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default microphone ▼" vertex="1">
<mxGeometry height="42" width="300" x="400" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_sys_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="System audio" vertex="1">
<mxGeometry height="28" width="160" x="760" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default output ▼" vertex="1">
<mxGeometry height="42" width="300" x="760" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_monitor" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Monitor microphone level" vertex="1">
<mxGeometry height="42" width="250" x="1110" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcription" vertex="1">
<mxGeometry height="30" width="180" x="360" y="675" as="geometry" />
</mxCell>
<mxCell id="sf_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="715" as="geometry" />
</mxCell>
<mxCell id="sf_model_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Model" vertex="1">
<mxGeometry height="28" width="120" x="400" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_model" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Whisper small ▼" vertex="1">
<mxGeometry height="42" width="260" x="400" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_device_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Compute" vertex="1">
<mxGeometry height="28" width="120" x="700" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_device" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="GPU ▼" vertex="1">
<mxGeometry height="42" width="220" x="700" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_lang_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Language" vertex="1">
<mxGeometry height="28" width="120" x="960" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_lang" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Auto detect ▼" vertex="1">
<mxGeometry height="42" width="220" x="960" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_diar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Speaker diarization" vertex="1">
<mxGeometry height="42" width="180" x="1210" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_save" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save changes" vertex="1">
<mxGeometry height="40" width="150" x="1240" y="875" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,568 @@
<mxfile host="Electron" agent="ChatGPT" pages="7">
<diagram id="dashboard" name="1. Dashboard">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="d_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault" vertex="1">
<mxGeometry height="860" width="230" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="d_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="⌂ Dashboard" vertex="1">
<mxGeometry height="44" width="180" x="85" y="130" as="geometry" />
</mxCell>
<mxCell id="d_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="◷ Meetings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="190" as="geometry" />
</mxCell>
<mxCell id="d_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="⚙ Settings" vertex="1">
<mxGeometry height="44" width="180" x="85" y="250" as="geometry" />
</mxCell>
<mxCell id="d_user" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Signed in as alex@example.com" vertex="1">
<mxGeometry height="70" width="180" x="85" y="800" as="geometry" />
</mxCell>
<mxCell id="d_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Good morning" vertex="1">
<mxGeometry height="40" width="420" x="340" y="90" as="geometry" />
</mxCell>
<mxCell id="d_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Record, transcribe, summarize, and follow up on meetings." vertex="1">
<mxGeometry height="30" width="560" x="340" y="135" as="geometry" />
</mxCell>
<mxCell id="d_start" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="+ Start new meeting" vertex="1">
<mxGeometry height="48" width="250" x="1210" y="90" as="geometry" />
</mxCell>
<mxCell id="d_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="340" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card1h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Quick start" vertex="1">
<mxGeometry height="30" width="180" x="365" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card1b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Microphone: Default System&amp;nbsp;&lt;div&gt;audio: On Local STT: Whisper small&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="360" y="290" as="geometry" />
</mxCell>
<mxCell id="d_card1btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Start recording" vertex="1">
<mxGeometry height="38" width="160" x="365" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="350" x="720" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card2h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live overlay" vertex="1">
<mxGeometry height="30" width="180" x="745" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card2b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Overlay: Enabled&amp;nbsp;&lt;div&gt;Position: Bottom center&amp;nbsp;&lt;/div&gt;&lt;div&gt;Speaker labels: On&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="745" y="280" as="geometry" />
</mxCell>
<mxCell id="d_card2btn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Preview overlay" vertex="1">
<mxGeometry height="38" width="170" x="745" y="350" as="geometry" />
</mxCell>
<mxCell id="d_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="180" width="360" x="1100" y="220" as="geometry" />
</mxCell>
<mxCell id="d_card3h" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Storage" vertex="1">
<mxGeometry height="30" width="180" x="1125" y="245" as="geometry" />
</mxCell>
<mxCell id="d_card3b" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="SeaweedFS connected&amp;nbsp;&lt;div&gt;Storage used: 12.8 GB Uploads: healthy&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="260" x="1125" y="290" as="geometry" />
</mxCell>
<mxCell id="d_storagechip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Connected" vertex="1">
<mxGeometry height="26" width="110" x="1270" y="245" as="geometry" />
</mxCell>
<mxCell id="d_recenth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Recent meetings" vertex="1">
<mxGeometry height="30" width="220" x="340" y="455" as="geometry" />
</mxCell>
<mxCell id="d_table" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="300" width="1120" x="340" y="500" as="geometry" />
</mxCell>
<mxCell id="d_th0" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Title" vertex="1">
<mxGeometry height="28" width="230" x="360" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Date" vertex="1">
<mxGeometry height="28" width="140" x="760" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Duration" vertex="1">
<mxGeometry height="28" width="120" x="930" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th3" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Status" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="515" as="geometry" />
</mxCell>
<mxCell id="d_th4" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Actions" vertex="1">
<mxGeometry height="28" width="140" x="1270" y="515" as="geometry" />
</mxCell>
<mxCell id="d_r0t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="34" width="340" x="360" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="48 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="555" as="geometry" />
</mxCell>
<mxCell id="d_r0s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="558" as="geometry" />
</mxCell>
<mxCell id="d_r0a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="557" as="geometry" />
</mxCell>
<mxCell id="d_r1t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Backend Architecture Review" vertex="1">
<mxGeometry height="34" width="340" x="360" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 26, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="61 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="625" as="geometry" />
</mxCell>
<mxCell id="d_r1s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Ready" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="628" as="geometry" />
</mxCell>
<mxCell id="d_r1a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="627" as="geometry" />
</mxCell>
<mxCell id="d_r2t" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Client Planning Call" vertex="1">
<mxGeometry height="34" width="340" x="360" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2d" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 25, 2026" vertex="1">
<mxGeometry height="34" width="150" x="760" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2dur" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="35 min" vertex="1">
<mxGeometry height="34" width="120" x="930" y="695" as="geometry" />
</mxCell>
<mxCell id="d_r2s" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Processing" vertex="1">
<mxGeometry height="28" width="100" x="1090" y="698" as="geometry" />
</mxCell>
<mxCell id="d_r2a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Open" vertex="1">
<mxGeometry height="30" width="90" x="1270" y="697" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="live" name="2. Live Meeting">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="l_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="l_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="l_timer" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="● REC 00:18:42" vertex="1">
<mxGeometry height="40" width="200" x="1260" y="140" as="geometry" />
</mxCell>
<mxCell id="l_left" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="860" x="100" y="210" as="geometry" />
</mxCell>
<mxCell id="l_transh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Live transcription" vertex="1">
<mxGeometry height="30" width="240" x="125" y="235" as="geometry" />
</mxCell>
<mxCell id="l_s1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="290" as="geometry" />
</mxCell>
<mxCell id="l_s1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the upload flow before Friday." vertex="1">
<mxGeometry height="42" width="630" x="250" y="285" as="geometry" />
</mxCell>
<mxCell id="l_s2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="125" y="360" as="geometry" />
</mxCell>
<mxCell id="l_s2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I can take the SeaweedFS integration and the presigned URL endpoint." vertex="1">
<mxGeometry height="54" width="630" x="250" y="355" as="geometry" />
</mxCell>
<mxCell id="l_s1b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="125" y="435" as="geometry" />
</mxCell>
<mxCell id="l_s1btxt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Great. I will handle the meeting job queue and reminders." vertex="1">
<mxGeometry height="54" width="630" x="250" y="430" as="geometry" />
</mxCell>
<mxCell id="l_partial" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Speaker 2 • listening…" vertex="1">
<mxGeometry height="48" width="760" x="125" y="525" as="geometry" />
</mxCell>
<mxCell id="l_wave" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="▁▃▅▆▅▃▂▁▂▅▇▆▃▂▁" vertex="1">
<mxGeometry height="40" width="760" x="125" y="600" as="geometry" />
</mxCell>
<mxCell id="l_controls" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Pause" vertex="1">
<mxGeometry height="40" width="110" x="125" y="690" as="geometry" />
</mxCell>
<mxCell id="l_overlaybtn" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Show overlay" vertex="1">
<mxGeometry height="40" width="150" x="250" y="690" as="geometry" />
</mxCell>
<mxCell id="l_finish" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Finish meeting" vertex="1">
<mxGeometry height="40" width="160" x="725" y="690" as="geometry" />
</mxCell>
<mxCell id="l_right" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="570" width="460" x="1000" y="210" as="geometry" />
</mxCell>
<mxCell id="l_speakersh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Speakers" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="235" as="geometry" />
</mxCell>
<mxCell id="l_sp1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 1" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="285" as="geometry" />
</mxCell>
<mxCell id="l_rename1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="285" as="geometry" />
</mxCell>
<mxCell id="l_sp2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Speaker 2" vertex="1">
<mxGeometry height="40" width="260" x="1025" y="345" as="geometry" />
</mxCell>
<mxCell id="l_rename2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Rename" vertex="1">
<mxGeometry height="40" width="110" x="1300" y="345" as="geometry" />
</mxCell>
<mxCell id="l_audioh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio sources" vertex="1">
<mxGeometry height="30" width="200" x="1025" y="435" as="geometry" />
</mxCell>
<mxCell id="l_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Microphone" vertex="1">
<mxGeometry height="38" width="180" x="1025" y="480" as="geometry" />
</mxCell>
<mxCell id="l_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ System audio" vertex="1">
<mxGeometry height="38" width="190" x="1220" y="480" as="geometry" />
</mxCell>
<mxCell id="l_stth" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Local transcription" vertex="1">
<mxGeometry height="30" width="220" x="1025" y="555" as="geometry" />
</mxCell>
<mxCell id="l_stt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Whisper small Device: GPU Latency: ~1.2 s" vertex="1">
<mxGeometry height="90" width="260" x="1025" y="595" as="geometry" />
</mxCell>
<mxCell id="l_sttchip" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Healthy" vertex="1">
<mxGeometry height="28" width="100" x="1300" y="610" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="overlay" name="3. Live Overlay">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="o_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Desktop / meeting app background" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="o_fakeapp" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video conference / presentation area" vertex="1">
<mxGeometry height="600" width="1100" x="250" y="130" as="geometry" />
</mxCell>
<mxCell id="o_toolbar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault overlay controls" vertex="1">
<mxGeometry height="42" width="320" x="1030" y="90" as="geometry" />
</mxCell>
<mxCell id="o_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#374151;fontColor=#ffffff;opacity=92;" vertex="1">
<mxGeometry height="190" width="820" x="390" y="590" as="geometry" />
</mxCell>
<mxCell id="o_sp1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#93c5fd;" value="Alice" vertex="1">
<mxGeometry height="28" width="100" x="425" y="620" as="geometry" />
</mxCell>
<mxCell id="o_txt1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="40" width="720" x="425" y="650" as="geometry" />
</mxCell>
<mxCell id="o_sp2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=14;fontStyle=1;fontColor=#86efac;" value="Bob" vertex="1">
<mxGeometry height="28" width="100" x="425" y="700" as="geometry" />
</mxCell>
<mxCell id="o_txt2" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="40" width="720" x="425" y="730" as="geometry" />
</mxCell>
<mxCell id="o_hint" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Overlay options: drag • resize • opacity • font size • click-through • show/hide speaker labels" vertex="1">
<mxGeometry height="30" width="820" x="390" y="805" as="geometry" />
</mxCell>
<mxCell id="6jg8ZA6zPTfZGke1Gjl6-1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=20;fontColor=#ffffff;" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;Click the speaker&#39;s name to rename&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="720" x="410" y="580" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="speaker" name="4. Rename Speakers">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="s_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Live meeting screen (dimmed)" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="s_modal" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1">
<mxGeometry height="600" width="660" x="470" y="160" as="geometry" />
</mxCell>
<mxCell id="s_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Rename speakers" vertex="1">
<mxGeometry height="40" width="300" x="510" y="200" as="geometry" />
</mxCell>
<mxCell id="s_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Speaker labels are local to this meeting. Rename them anytime during the session." vertex="1">
<mxGeometry height="40" width="520" x="510" y="245" as="geometry" />
</mxCell>
<mxCell id="s_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="320" as="geometry" />
</mxCell>
<mxCell id="s_label1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Speaker 1" vertex="1">
<mxGeometry height="28" width="110" x="535" y="342" as="geometry" />
</mxCell>
<mxCell id="s_input1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Alice" vertex="1">
<mxGeometry height="42" width="360" x="535" y="382" as="geometry" />
</mxCell>
<mxCell id="s_save1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="382" as="geometry" />
</mxCell>
<mxCell id="s_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1">
<mxGeometry height="120" width="580" x="510" y="470" as="geometry" />
</mxCell>
<mxCell id="s_label2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Speaker 2" vertex="1">
<mxGeometry height="28" width="110" x="535" y="492" as="geometry" />
</mxCell>
<mxCell id="s_input2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Bob" vertex="1">
<mxGeometry height="42" width="360" x="535" y="532" as="geometry" />
</mxCell>
<mxCell id="s_save2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save" vertex="1">
<mxGeometry height="42" width="120" x="915" y="532" as="geometry" />
</mxCell>
<mxCell id="s_note" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Tip: if diarization temporarily swaps speakers, you can reassign the latest segment from the transcript view." vertex="1">
<mxGeometry height="60" width="540" x="510" y="630" as="geometry" />
</mxCell>
<mxCell id="s_close" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Close" vertex="1">
<mxGeometry height="42" width="150" x="900" y="690" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="review" name="6. Meeting Review">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="r_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="r_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="40" width="500" x="100" y="140" as="geometry" />
</mxCell>
<mxCell id="r_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 speakers" vertex="1">
<mxGeometry height="30" width="420" x="100" y="185" as="geometry" />
</mxCell>
<mxCell id="r_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / audio player 00:18:42 / 00:48:05" vertex="1">
<mxGeometry height="220" width="700" x="100" y="240" as="geometry" />
</mxCell>
<mxCell id="r_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="180" x="100" y="510" as="geometry" />
</mxCell>
<mxCell id="r_tbox" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Alice 00:18:41 We should finalize the API contract before tomorrow. Bob 00:18:49 I will update the database migration tonight. Alice 00:19:02 Perfect, then I&#39;ll prepare the release notes." vertex="1">
<mxGeometry height="260" width="700" x="100" y="550" as="geometry" />
</mxCell>
<mxCell id="r_sumh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Summary" vertex="1">
<mxGeometry height="30" width="200" x="850" y="240" as="geometry" />
</mxCell>
<mxCell id="r_sum" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration tonight, while Alice prepares the release notes." vertex="1">
<mxGeometry height="140" width="590" x="850" y="280" as="geometry" />
</mxCell>
<mxCell id="r_taskh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Action items" vertex="1">
<mxGeometry height="30" width="200" x="850" y="465" as="geometry" />
</mxCell>
<mxCell id="r_task1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Update database migration Bob • Due tonight" vertex="1">
<mxGeometry height="70" width="590" x="850" y="505" as="geometry" />
</mxCell>
<mxCell id="r_task2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="☐ Prepare release notes Alice • Due tomorrow" vertex="1">
<mxGeometry height="70" width="590" x="850" y="590" as="geometry" />
</mxCell>
<mxCell id="r_rem" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="42" width="180" x="850" y="705" as="geometry" />
</mxCell>
<mxCell id="r_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export transcript" vertex="1">
<mxGeometry height="42" width="180" x="1050" y="705" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker&#39;s name" vertex="1">
<mxGeometry height="42" width="180" x="420" y="505" as="geometry" />
</mxCell>
<mxCell id="9EBs0guQWN_vwKdUdXgs-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy transcript" vertex="1">
<mxGeometry height="42" width="180" x="620" y="505" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="meeting_details" name="7. Meeting Details">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="md_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="md_back" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="← Back to meetings" vertex="1">
<mxGeometry height="38" width="160" x="100" y="135" as="geometry" />
</mxCell>
<mxCell id="md_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="42" width="500" x="100" y="190" as="geometry" />
</mxCell>
<mxCell id="md_meta" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Sep 27, 2026 • 48 min • 2 detected speakers • Ready" vertex="1">
<mxGeometry height="30" width="520" x="100" y="235" as="geometry" />
</mxCell>
<mxCell id="md_edit" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Edit details" vertex="1">
<mxGeometry height="40" width="120" x="1180" y="185" as="geometry" />
</mxCell>
<mxCell id="md_delete" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" value="Delete" vertex="1">
<mxGeometry height="40" width="110" x="1320" y="185" as="geometry" />
</mxCell>
<mxCell id="md_player" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Video / Audio Player ▶ 00:18:42 ━━━━━━━━━━━━━━━━━━━ 00:48:05 Volume • Speed 1.0x • Full screen" vertex="1">
<mxGeometry height="230" width="760" x="100" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Meeting information" vertex="1">
<mxGeometry height="30" width="220" x="910" y="300" as="geometry" />
</mxCell>
<mxCell id="md_info_box" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Title Weekly Product Sync Started Sep 27, 2026 09:00 Ended Sep 27, 2026 09:48 Language English Status Ready" vertex="1">
<mxGeometry height="190" width="520" x="910" y="340" as="geometry" />
</mxCell>
<mxCell id="md_tabs" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Transcript Summary Action items Files" vertex="1">
<mxGeometry height="42" width="1330" x="100" y="575" as="geometry" />
</mxCell>
<mxCell id="md_transcript" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcript" vertex="1">
<mxGeometry height="30" width="200" x="100" y="640" as="geometry" />
</mxCell>
<mxCell id="md_search" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Search transcript..." vertex="1">
<mxGeometry height="38" width="300" x="1030" y="635" as="geometry" />
</mxCell>
<mxCell id="md_export" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Export" vertex="1">
<mxGeometry height="38" width="85" x="1345" y="635" as="geometry" />
</mxCell>
<mxCell id="md_t1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:18:41" vertex="1">
<mxGeometry height="28" width="150" x="100" y="690" as="geometry" />
</mxCell>
<mxCell id="md_t1txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="We should finalize the API contract before tomorrow." vertex="1">
<mxGeometry height="38" width="690" x="270" y="686" as="geometry" />
</mxCell>
<mxCell id="md_t2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Bob 00:18:49" vertex="1">
<mxGeometry height="28" width="150" x="100" y="740" as="geometry" />
</mxCell>
<mxCell id="md_t2txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="I will update the database migration tonight." vertex="1">
<mxGeometry height="38" width="690" x="270" y="736" as="geometry" />
</mxCell>
<mxCell id="md_t3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Alice 00:19:02" vertex="1">
<mxGeometry height="28" width="150" x="100" y="790" as="geometry" />
</mxCell>
<mxCell id="md_t3txt" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Perfect. I&#39;ll prepare the release notes after that." vertex="1">
<mxGeometry height="38" width="690" x="270" y="786" as="geometry" />
</mxCell>
<mxCell id="md_rightsum" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Generated summary" vertex="1">
<mxGeometry height="30" width="190" x="1010" y="690" as="geometry" />
</mxCell>
<mxCell id="md_summary" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="The team agreed to finalize the API contract before tomorrow. Bob will update the database migration, while Alice prepares release notes." vertex="1">
<mxGeometry height="95" width="420" x="1010" y="730" as="geometry" />
</mxCell>
<mxCell id="md_regen" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Regenerate summary" vertex="1">
<mxGeometry height="38" width="170" x="1010" y="845" as="geometry" />
</mxCell>
<mxCell id="md_reminder" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Create reminder" vertex="1">
<mxGeometry height="38" width="150" x="1195" y="845" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Copy" vertex="1">
<mxGeometry height="38" width="170" x="140" y="850" as="geometry" />
</mxCell>
<mxCell id="4IYnDq8jVSWbccKvp8l8-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Change speaker name" vertex="1">
<mxGeometry height="38" width="150" x="325" y="850" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="settings_full" name="8. Settings - Full">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="sf_frame" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="860" width="1480" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_sidebar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="MeetVault Settings" vertex="1">
<mxGeometry height="860" width="250" x="60" y="50" as="geometry" />
</mxCell>
<mxCell id="sf_nav1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="General" vertex="1">
<mxGeometry height="42" width="190" x="85" y="150" as="geometry" />
</mxCell>
<mxCell id="sf_nav2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Audio" vertex="1">
<mxGeometry height="42" width="190" x="85" y="205" as="geometry" />
</mxCell>
<mxCell id="sf_nav3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Transcription" vertex="1">
<mxGeometry height="42" width="190" x="85" y="260" as="geometry" />
</mxCell>
<mxCell id="sf_nav4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Overlay" vertex="1">
<mxGeometry height="42" width="190" x="85" y="315" as="geometry" />
</mxCell>
<mxCell id="sf_nav5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Storage &amp; Sync" vertex="1">
<mxGeometry height="42" width="190" x="85" y="370" as="geometry" />
</mxCell>
<mxCell id="sf_nav6" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#20242b;strokeColor=#20242b;fontColor=#ffffff;" value="Account" vertex="1">
<mxGeometry height="42" width="190" x="85" y="425" as="geometry" />
</mxCell>
<mxCell id="sf_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Settings" vertex="1">
<mxGeometry height="40" width="300" x="360" y="90" as="geometry" />
</mxCell>
<mxCell id="sf_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Configure MeetVault desktop behavior and local transcription." vertex="1">
<mxGeometry height="30" width="620" x="360" y="135" as="geometry" />
</mxCell>
<mxCell id="sf_general" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="General" vertex="1">
<mxGeometry height="30" width="180" x="360" y="200" as="geometry" />
</mxCell>
<mxCell id="sf_card1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="240" as="geometry" />
</mxCell>
<mxCell id="sf_launch" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Launch MeetVault at startup" vertex="1">
<mxGeometry height="38" width="320" x="400" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_tray" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Keep running in system tray" vertex="1">
<mxGeometry height="38" width="320" x="400" y="320" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Global hotkey" vertex="1">
<mxGeometry height="28" width="150" x="780" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_hotkey" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Ctrl + Shift + M" vertex="1">
<mxGeometry height="42" width="260" x="780" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_theme_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Theme" vertex="1">
<mxGeometry height="28" width="120" x="1090" y="270" as="geometry" />
</mxCell>
<mxCell id="sf_theme" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="System default ▼" vertex="1">
<mxGeometry height="42" width="260" x="1090" y="305" as="geometry" />
</mxCell>
<mxCell id="sf_audio" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio" vertex="1">
<mxGeometry height="30" width="180" x="360" y="430" as="geometry" />
</mxCell>
<mxCell id="sf_card2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="160" width="1070" x="360" y="470" as="geometry" />
</mxCell>
<mxCell id="sf_mic_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Microphone" vertex="1">
<mxGeometry height="28" width="160" x="400" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default microphone ▼" vertex="1">
<mxGeometry height="42" width="300" x="400" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_sys_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="System audio" vertex="1">
<mxGeometry height="28" width="160" x="760" y="500" as="geometry" />
</mxCell>
<mxCell id="sf_sys" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Default output ▼" vertex="1">
<mxGeometry height="42" width="300" x="760" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_monitor" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Monitor microphone level" vertex="1">
<mxGeometry height="42" width="250" x="1110" y="535" as="geometry" />
</mxCell>
<mxCell id="sf_trans" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcription" vertex="1">
<mxGeometry height="30" width="180" x="360" y="675" as="geometry" />
</mxCell>
<mxCell id="sf_card3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="" vertex="1">
<mxGeometry height="150" width="1070" x="360" y="715" as="geometry" />
</mxCell>
<mxCell id="sf_model_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Model" vertex="1">
<mxGeometry height="28" width="120" x="400" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_model" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Whisper small ▼" vertex="1">
<mxGeometry height="42" width="260" x="400" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_device_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Compute" vertex="1">
<mxGeometry height="28" width="120" x="700" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_device" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="GPU ▼" vertex="1">
<mxGeometry height="42" width="220" x="700" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_lang_lbl" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=12;fontColor=#6b7280;" value="Language" vertex="1">
<mxGeometry height="28" width="120" x="960" y="740" as="geometry" />
</mxCell>
<mxCell id="sf_lang" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Auto detect ▼" vertex="1">
<mxGeometry height="42" width="220" x="960" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_diar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Speaker diarization" vertex="1">
<mxGeometry height="42" width="180" x="1210" y="775" as="geometry" />
</mxCell>
<mxCell id="sf_save" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Save changes" vertex="1">
<mxGeometry height="40" width="150" x="1240" y="875" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,455 @@
<mxfile host="Electron" agent="ChatGPT" pages="9">
<diagram id="android_home" name="1. Home">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ah_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="900" width="1520" x="40" y="30" as="geometry" />
</mxCell>
<mxCell id="ah_phone" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="840" width="430" x="540" y="55" as="geometry" />
</mxCell>
<mxCell id="ah_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Good evening" vertex="1">
<mxGeometry height="36" width="250" x="575" y="145" as="geometry" />
</mxCell>
<mxCell id="ah_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="Record, transcribe and review meetings." vertex="1">
<mxGeometry height="28" width="310" x="575" y="185" as="geometry" />
</mxCell>
<mxCell id="ah_start" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="+ Start Meeting" vertex="1">
<mxGeometry height="52" width="360" x="575" y="235" as="geometry" />
</mxCell>
<mxCell id="ah_statush" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Status" vertex="1">
<mxGeometry height="28" width="120" x="575" y="330" as="geometry" />
</mxCell>
<mxCell id="ah_model" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Whisper base" vertex="1">
<mxGeometry height="42" width="170" x="575" y="370" as="geometry" />
</mxCell>
<mxCell id="ah_overlay" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Overlay granted" vertex="1">
<mxGeometry height="42" width="175" x="760" y="370" as="geometry" />
</mxCell>
<mxCell id="ah_recent" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Recent meetings" vertex="1">
<mxGeometry height="28" width="200" x="575" y="445" as="geometry" />
</mxCell>
<mxCell id="ah_r1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Weekly Product Sync Today • 48 min • Ready" vertex="1">
<mxGeometry height="72" width="360" x="575" y="490" as="geometry" />
</mxCell>
<mxCell id="ah_r2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Backend Architecture Review Yesterday • 61 min • Ready" vertex="1">
<mxGeometry height="72" width="360" x="575" y="575" as="geometry" />
</mxCell>
<mxCell id="ah_r3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Client Planning Call Sep 25 • 35 min • Processing" vertex="1">
<mxGeometry height="72" width="360" x="575" y="660" as="geometry" />
</mxCell>
<mxCell id="ah_nav" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="Home Meetings Settings" vertex="1">
<mxGeometry height="50" width="360" x="575" y="805" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_start" name="2. Start Meeting">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="as_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="900" width="1520" x="40" y="30" as="geometry" />
</mxCell>
<mxCell id="as_phone" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="840" width="430" x="540" y="55" as="geometry" />
</mxCell>
<mxCell id="as_top" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" value="← Start Meeting" vertex="1">
<mxGeometry height="58" width="430" x="540" y="55" as="geometry" />
</mxCell>
<mxCell id="as_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Meeting setup" vertex="1">
<mxGeometry height="36" width="250" x="575" y="135" as="geometry" />
</mxCell>
<mxCell id="as_lbl1" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=11;fontColor=#6b7280;" value="Meeting title" vertex="1">
<mxGeometry height="24" width="130" x="575" y="185" as="geometry" />
</mxCell>
<mxCell id="as_titlein" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" value="Weekly Product Sync" vertex="1">
<mxGeometry height="46" width="360" x="575" y="215" as="geometry" />
</mxCell>
<mxCell id="as_audioh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Audio" vertex="1">
<mxGeometry height="28" width="100" x="575" y="290" as="geometry" />
</mxCell>
<mxCell id="as_mic" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Microphone Default mic ▼" vertex="1">
<mxGeometry height="48" width="360" x="575" y="330" as="geometry" />
</mxCell>
<mxCell id="as_playback" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Playback audio Optional / supported only" vertex="1">
<mxGeometry height="48" width="360" x="575" y="390" as="geometry" />
</mxCell>
<mxCell id="as_transh" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" value="Transcription" vertex="1">
<mxGeometry height="28" width="140" x="575" y="465" as="geometry" />
</mxCell>
<mxCell id="as_model" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Model Whisper base ▼" vertex="1">
<mxGeometry height="48" width="360" x="575" y="505" as="geometry" />
</mxCell>
<mxCell id="as_lang" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Language Auto detect ▼" vertex="1">
<mxGeometry height="48" width="360" x="575" y="565" as="geometry" />
</mxCell>
<mxCell id="as_diar" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Speaker diarization" vertex="1">
<mxGeometry height="42" width="175" x="575" y="625" as="geometry" />
</mxCell>
<mxCell id="as_ol" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" value="✓ Live overlay" vertex="1">
<mxGeometry height="42" width="175" x="760" y="625" as="geometry" />
</mxCell>
<mxCell id="as_perm" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Mic ✓ Notifications ✓ Overlay ✓" vertex="1">
<mxGeometry height="40" width="360" x="575" y="690" as="geometry" />
</mxCell>
<mxCell id="as_go" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Start Meeting" vertex="1">
<mxGeometry height="52" width="360" x="575" y="760" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_live" name="3. Live Meeting">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="al_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="1520" height="900" as="geometry" />
</mxCell>
<mxCell id="al_phone" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="840" as="geometry" />
</mxCell>
<mxCell id="al_top" value="Weekly Product Sync" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="58" as="geometry" />
</mxCell>
<mxCell id="al_rec" value="● REC 00:18:42" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" vertex="1" parent="1">
<mxGeometry x="575" y="135" width="160" height="38" as="geometry" />
</mxCell>
<mxCell id="al_overlay" value="Overlay ON" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="760" y="135" width="175" height="38" as="geometry" />
</mxCell>
<mxCell id="al_transh" value="Live transcript" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="205" width="170" height="28" as="geometry" />
</mxCell>
<mxCell id="al_s1" value="Alice" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="575" y="250" width="90" height="28" as="geometry" />
</mxCell>
<mxCell id="al_t1" value="We should finalize the API contract before tomorrow." style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="680" y="244" width="250" height="52" as="geometry" />
</mxCell>
<mxCell id="al_s2" value="Bob" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="575" y="320" width="90" height="28" as="geometry" />
</mxCell>
<mxCell id="al_t2" value="I&#39;ll update the database migration tonight." style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="680" y="314" width="250" height="52" as="geometry" />
</mxCell>
<mxCell id="al_s3" value="Speaker 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="390" width="90" height="28" as="geometry" />
</mxCell>
<mxCell id="al_t3" value="Can we move the deadline to Friday?" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="680" y="384" width="250" height="52" as="geometry" />
</mxCell>
<mxCell id="al_partial" value="Speaker 2 • listening… We also need to check the…" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="465" width="360" height="62" as="geometry" />
</mxCell>
<mxCell id="al_levels" value="Mic ▂▅▇▆▃ ASR Healthy Diarization Healthy" style="text;html=1;align=left;verticalAlign=middle;fontSize=11;fontColor=#6b7280;" vertex="1" parent="1">
<mxGeometry x="575" y="555" width="360" height="35" as="geometry" />
</mxCell>
<mxCell id="al_speakers" value="Speakers" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="615" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="al_sp1" value="Alice Rename" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="650" width="170" height="44" as="geometry" />
</mxCell>
<mxCell id="al_sp2" value="Bob Rename" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="765" y="650" width="170" height="44" as="geometry" />
</mxCell>
<mxCell id="al_pause" value="Pause" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="575" y="735" width="105" height="46" as="geometry" />
</mxCell>
<mxCell id="al_olbtn" value="Overlay" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="690" y="735" width="105" height="46" as="geometry" />
</mxCell>
<mxCell id="al_finish" value="Finish" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#fecaca;fontColor=#991b1b;" vertex="1" parent="1">
<mxGeometry x="805" y="735" width="130" height="46" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_overlay" name="4. Realtime Overlay">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ao_bg" value="Other application / video meeting" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="80" y="70" width="1440" height="800" as="geometry" />
</mxCell>
<mxCell id="ao_fake" value="Video call / presentation content" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="320" y="140" width="960" height="560" as="geometry" />
</mxCell>
<mxCell id="ao_bubble" value="MV" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="1310" y="160" width="52" height="52" as="geometry" />
</mxCell>
<mxCell id="ao_overlay" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#374151;fontColor=#ffffff;opacity=92;" vertex="1" parent="1">
<mxGeometry x="460" y="590" width="680" height="180" as="geometry" />
</mxCell>
<mxCell id="ao_n1" value="Alice" style="text;html=1;align=left;fontStyle=1;fontSize=14;fontColor=#93c5fd;" vertex="1" parent="1">
<mxGeometry x="490" y="615" width="100" height="24" as="geometry" />
</mxCell>
<mxCell id="ao_t1" value="We should finalize the API contract before tomorrow." style="text;html=1;align=left;fontSize=19;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="490" y="645" width="600" height="42" as="geometry" />
</mxCell>
<mxCell id="ao_n2" value="Bob" style="text;html=1;align=left;fontStyle=1;fontSize=14;fontColor=#86efac;" vertex="1" parent="1">
<mxGeometry x="490" y="695" width="100" height="24" as="geometry" />
</mxCell>
<mxCell id="ao_t2" value="I&#39;ll update the migration tonight." style="text;html=1;align=left;fontSize=19;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="490" y="725" width="600" height="38" as="geometry" />
</mxCell>
<mxCell id="ao_note" value="Drag • collapse • reopen app • close overlay" style="text;html=1;align=left;verticalAlign=middle;fontSize=11;fontColor=#6b7280;" vertex="1" parent="1">
<mxGeometry x="480" y="795" width="640" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_rename" name="5. Rename Speakers">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ar_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="1520" height="900" as="geometry" />
</mxCell>
<mxCell id="ar_phone" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="840" as="geometry" />
</mxCell>
<mxCell id="ar_top" value="Weekly Product Sync" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="58" as="geometry" />
</mxCell>
<mxCell id="ar_dim" value="Live transcript behind sheet" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="565" y="135" width="380" height="340" as="geometry" />
</mxCell>
<mxCell id="ar_sheet" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="540" y="470" width="430" height="425" as="geometry" />
</mxCell>
<mxCell id="ar_title" value="Rename speakers" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="500" width="260" height="36" as="geometry" />
</mxCell>
<mxCell id="ar_desc" value="Names apply to the current meeting." style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="540" width="300" height="28" as="geometry" />
</mxCell>
<mxCell id="ar_s1" value="Speaker 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="575" y="590" width="100" height="28" as="geometry" />
</mxCell>
<mxCell id="ar_i1" value="Alice" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" vertex="1" parent="1">
<mxGeometry x="575" y="625" width="250" height="44" as="geometry" />
</mxCell>
<mxCell id="ar_save1" value="Save" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="835" y="625" width="100" height="44" as="geometry" />
</mxCell>
<mxCell id="ar_s2" value="Speaker 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="575" y="690" width="100" height="28" as="geometry" />
</mxCell>
<mxCell id="ar_i2" value="Bob" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" vertex="1" parent="1">
<mxGeometry x="575" y="725" width="250" height="44" as="geometry" />
</mxCell>
<mxCell id="ar_save2" value="Save" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="835" y="725" width="100" height="44" as="geometry" />
</mxCell>
<mxCell id="ar_done" value="Done" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="575" y="805" width="360" height="48" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_meetings" name="6. Meetings">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="am_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="1520" height="900" as="geometry" />
</mxCell>
<mxCell id="am_phone" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="840" as="geometry" />
</mxCell>
<mxCell id="am_top" value="Meetings" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="58" as="geometry" />
</mxCell>
<mxCell id="am_search" value="Search meetings..." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;align=left;spacingLeft=10;fontColor=#64748b;" vertex="1" parent="1">
<mxGeometry x="575" y="140" width="360" height="46" as="geometry" />
</mxCell>
<mxCell id="am_filter" value="All Ready Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="205" width="360" height="38" as="geometry" />
</mxCell>
<mxCell id="am_m1" value="Weekly Product Sync Sep 27 • 48 min Ready" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="270" width="360" height="95" as="geometry" />
</mxCell>
<mxCell id="am_m2" value="Backend Architecture Review Sep 26 • 61 min Ready" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="380" width="360" height="95" as="geometry" />
</mxCell>
<mxCell id="am_m3" value="Client Planning Call Sep 25 • 35 min Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="490" width="360" height="95" as="geometry" />
</mxCell>
<mxCell id="am_m4" value="Interview Recording Sep 23 • 42 min Local only" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="600" width="360" height="95" as="geometry" />
</mxCell>
<mxCell id="am_nav" value="Home Meetings Settings" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="805" width="360" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_details" name="7. Meeting Details">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ad_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="1520" height="900" as="geometry" />
</mxCell>
<mxCell id="ad_phone" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="840" as="geometry" />
</mxCell>
<mxCell id="ad_top" value="← Weekly Product Sync" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="58" as="geometry" />
</mxCell>
<mxCell id="ad_meta" value="Sep 27 • 48 min • Ready" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="135" width="300" height="28" as="geometry" />
</mxCell>
<mxCell id="ad_player" value="▶ 00:18:42 ━━━━━━━━━ 00:48:05" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="180" width="360" height="100" as="geometry" />
</mxCell>
<mxCell id="ad_tabs" value="Transcript Summary Tasks Files" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="575" y="300" width="360" height="40" as="geometry" />
</mxCell>
<mxCell id="ad_t1" value="Alice 00:18:41" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="575" y="365" width="130" height="28" as="geometry" />
</mxCell>
<mxCell id="ad_tt1" value="We should finalize the API contract." style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="400" width="350" height="42" as="geometry" />
</mxCell>
<mxCell id="ad_t2" value="Bob 00:18:49" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="575" y="465" width="130" height="28" as="geometry" />
</mxCell>
<mxCell id="ad_tt2" value="I&#39;ll update the migration tonight." style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="500" width="350" height="42" as="geometry" />
</mxCell>
<mxCell id="ad_sumh" value="Summary" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="575" width="100" height="28" as="geometry" />
</mxCell>
<mxCell id="ad_sum" value="The team agreed to finalize the API contract before tomorrow and complete the migration update tonight." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="615" width="360" height="90" as="geometry" />
</mxCell>
<mxCell id="ad_actions" value="Create reminder" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="575" y="735" width="170" height="44" as="geometry" />
</mxCell>
<mxCell id="ad_export" value="Export" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" vertex="1" parent="1">
<mxGeometry x="765" y="735" width="170" height="44" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_settings" name="8. Settings">
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="aset_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="1520" height="900" as="geometry" />
</mxCell>
<mxCell id="aset_phone" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="840" as="geometry" />
</mxCell>
<mxCell id="aset_top" value="Settings" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="540" y="55" width="430" height="58" as="geometry" />
</mxCell>
<mxCell id="aset_general" value="General" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="135" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="aset_g1" value="Theme System ▼" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="170" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_g2" value="Notifications On" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="220" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_audio" value="Audio" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="290" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="aset_a1" value="Microphone Default ▼" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="325" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_a2" value="Playback capture Off" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="375" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_trans" value="Transcription" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="445" width="140" height="28" as="geometry" />
</mxCell>
<mxCell id="aset_t1" value="Model Whisper base ▼" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="480" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_t2" value="Language Auto ▼" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="530" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_t3" value="Speaker diarization On" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="580" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_ol" value="Overlay" style="text;html=1;align=left;verticalAlign=middle;fontSize=15;fontStyle=1;fontColor=#111827;" vertex="1" parent="1">
<mxGeometry x="575" y="650" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="aset_o1" value="Opacity 85%" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="685" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_o2" value="Visible lines 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" vertex="1" parent="1">
<mxGeometry x="575" y="735" width="360" height="44" as="geometry" />
</mxCell>
<mxCell id="aset_nav" value="Home Meetings Settings" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3f4f6;strokeColor=#e5e7eb;fontColor=#374151;" vertex="1" parent="1">
<mxGeometry x="575" y="805" width="360" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="android_permissions" name="9. Permissions">
<mxGraphModel dx="2054" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ap_bg" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8f9fb;strokeColor=#cfd6df;strokeWidth=1.5;" value="" vertex="1">
<mxGeometry height="900" width="1520" x="40" y="30" as="geometry" />
</mxCell>
<mxCell id="ap_phone" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#111827;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="840" width="430" x="540" y="55" as="geometry" />
</mxCell>
<mxCell id="ap_top" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#111827;fontColor=#ffffff;" value="Permissions" vertex="1">
<mxGeometry height="58" width="430" x="540" y="55" as="geometry" />
</mxCell>
<mxCell id="ap_title" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#111827;" value="Set up MeetVault" vertex="1">
<mxGeometry height="36" width="250" x="575" y="145" as="geometry" />
</mxCell>
<mxCell id="ap_desc" parent="1" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontColor=#374151;" value="These permissions are needed for realtime meetings." vertex="1">
<mxGeometry height="44" width="340" x="575" y="185" as="geometry" />
</mxCell>
<mxCell id="ap_p1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Microphone Required for recording and transcription." vertex="1">
<mxGeometry height="80" width="360" x="575" y="255" as="geometry" />
</mxCell>
<mxCell id="ap_b1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Granted" vertex="1">
<mxGeometry height="32" width="100" x="810" y="275" as="geometry" />
</mxCell>
<mxCell id="ap_p2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Notifications Required for the foreground meeting service." vertex="1">
<mxGeometry height="80" width="360" x="575" y="355" as="geometry" />
</mxCell>
<mxCell id="ap_b2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#a7f3d0;fontColor=#065f46;fontSize=11;" value="Granted" vertex="1">
<mxGeometry height="32" width="100" x="810" y="375" as="geometry" />
</mxCell>
<mxCell id="ap_p3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Display over other apps Required only for live floating captions." vertex="1">
<mxGeometry height="90" width="360" x="575" y="455" as="geometry" />
</mxCell>
<mxCell id="ap_b3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Grant" vertex="1">
<mxGeometry height="34" width="100" x="810" y="485" as="geometry" />
</mxCell>
<mxCell id="ap_p4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d9dee7;" value="Battery optimization Recommended: allow MeetVault during meetings." vertex="1">
<mxGeometry height="90" width="360" x="575" y="570" as="geometry" />
</mxCell>
<mxCell id="ap_b4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#c7d2fe;fontColor=#1e3a8a;" value="Review" vertex="1">
<mxGeometry height="34" width="100" x="810" y="600" as="geometry" />
</mxCell>
<mxCell id="ap_done" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2563eb;strokeColor=#2563eb;fontColor=#ffffff;fontStyle=1;" value="Continue" vertex="1">
<mxGeometry height="50" width="360" x="575" y="720" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>