v2.0 privacy-first on-premise

Meetily

Local meeting transcription
with speaker diarization

Ryzen 9 7950X / RTX 3090 Ti / 64 GB
100% local. Zero cloud.

Scroll
PYANNOTE.AUDIO 3.1 / FASTER-WHISPER LARGE-V3 / OLLAMA MISTRAL 7B / DOCKER COMPOSE / TAILSCALE / FR / DE / EN / IT / PYANNOTE.AUDIO 3.1 / FASTER-WHISPER LARGE-V3 / OLLAMA MISTRAL 7B / DOCKER COMPOSE / TAILSCALE / FR / DE / EN / IT /
01
Pipeline
01

Capture

iOS Shortcut
M4A / WAV
via Tailscale

02

Preprocess

ffmpeg
WAV 16kHz mono
VAD trimming

03

Diarize

pyannote.audio 3.1
GPU ~2GB VRAM
who spoke when

04

Transcribe

faster-whisper
large-v3 ~6GB
FR/DE/EN/IT auto

05

Assembly

Merge timeline
who + what
unified segments

06

Summarize

Ollama Mistral 7B
~5GB VRAM
structured notes

DATAFLOW

audio preprocess diarize transcribe assemble summarize output
02
Services

5 containers.
1 compose file.

Peak VRAM usage: ~13 GB / 24 GB available. Sequential GPU access. No orchestration overhead.

meetily-gateway
PORT :8400
REST API intake, orchestration
GPU No
pyannote-service
PORT :8401
Speaker diarization
GPU Yes
~2 GB
faster-whisper
PORT :8402
Speech-to-text transcription
GPU Yes
~6 GB
meetily-processor
PORT :8403
Assembly + LLM summary
GPU No
ollama
PORT :11434
LLM inference (Mistral 7B)
GPU Yes
~5 GB
03
Performance
<0.35x

Realtime factor

Audio duration multiplier.
Faster than real-time processing.

15m

For 1h audio

End-to-end processing time.
From upload to structured notes.

13GB

Peak VRAM

Sequential GPU access.
54% of RTX 3090 Ti capacity.

Output format

JSON structured + Markdown meeting notes

executive summary key points decisions action items full transcript speaker labels
04
API

REST gateway
on port 8400

Auth via X-API-Key header. Tailscale-only access.

POST /api/v1/meetings
# Submit a meeting recording
curl -X POST https://horizon:8400/api/v1/meetings \
  -H "X-API-Key: $API_KEY" \
  -F "audio=@meeting.m4a" \
  -F "title=Standup 2026-03-27"

# Response
{
  "meeting_id": "m_7f3a9b2e",
  "status": "processing",
  "estimated_duration": "15m"
}
GET /api/v1/meetings/:id
# Check status
curl https://horizon:8400/api/v1/meetings/m_7f3a9b2e \
  -H "X-API-Key: $API_KEY"

# Response
{
  "status": "completed",
  "pipeline": {
    "diarization": "done",
    "transcription": "done",
    "summary": "done"
  },
  "result_url": "/api/v1/meetings/m_7f3a9b2e/result"
}
GET /api/v1/meetings/:id/result
# Get results
curl https://horizon:8400/api/v1/meetings/m_7f3a9b2e/result \
  -H "X-API-Key: $API_KEY"

# Response (truncated)
{
  "summary": {
    "executive": "Team discussed Q2 roadmap...",
    "decisions": ["Ship meetily-v2 by March"],
    "action_items": ["@alex: Deploy to Horizon"]
  },
  "transcript": [
    {
      "speaker": "SPEAKER_00",
      "start": 0.0,
      "end": 4.2,
      "text": "Okay, let's get started."
    }
  ]
}
05
Roadmap
P1 current

MVP

End-to-end pipeline
iOS Shortcut integration
Docker Compose deploy
REST API + auth

P2 next

Intelligence

Speaker voiceprints
Web UI dashboard
Synology storage
Slack notifications

P3 future

Integration

Obsidian sync
Calendar integration
RAG on meeting history
Cross-meeting insights