Separate requests from jobs
Long GPU processing lives in a server job while the UI polls its ID. If the upload response is lost, the client looks for a matching existing job and reconnects.
Internal operation · public UI demo
A meeting assistant used by the education and development departments of a company of approximately 32 people. I own planning, development, deployment, operations, and maintenance on an RTX 4090 server.

Aug + Sep 2026 supplied counts · not active users
363 + 470 minutes · not time saved
Internal service · sole operations and maintenance owner
01 / WORKFLOW
A CLI tool became a web interface and Docker service for internal staff, connecting recording, transcription, speaker attribution, minutes, Notion storage, and email delivery.
I am the sole owner across planning, the speech pipeline and web UI, sign-in and access boundaries, deployment, operations, and maintenance. Requests from education and development staff led to an error-management UI, recording backups, and an Android web app.
02 / USAGE · 2026.08–09
The service is used by the education and development departments of a company of approximately 32 people. These monthly aggregates were supplied from the operating UI on Sep 15, 2026; individual names and activity are omitted.
| Period | Recorded meetings | Meeting duration |
|---|---|---|
| 2026.08 | 10 | 363 min |
| 2026.09 · supplied Sep 15 | 22 | 470 min |
03 / USER REQUESTS
As the operations owner, I brought logs, completed and failed jobs, and retry actions into the UI so I can investigate failures and respond. Requests to retain recordings and simplify mobile use led to backups and an Android web app.
| Request or operational need | Delivered change |
|---|---|
| Locate failures and respond | Inspect logs and completed/failed records; retry from the UI |
| Keep a separate recording copy | Recording-file backup |
| Make mobile recording easier for older users | Android web app with a simplified recording flow |
04 / SYSTEM
An RTX 4090 runs faster-whisper and pyannote. Transcription and diarization are serialized, with waiting jobs marked queued. Transcript text is sent to the external Claude API to generate structured minutes.
The server returns a job ID instead of holding an HTTP response for the full audio pipeline. Short status polls separate long inference jobs from proxy request limits.
faster-whisper
pyannote · RTX 4090
Claude · structured JSON
Notion · SMTP
05 / CHANGE · 2026.09
A job can be created on the server while its start response arrives as an HTML error. A JSON parsing error then makes the upload appear to have failed. The client now looks for an existing in-progress job before asking the user to upload again.
Detect HTML / 5xx
Own in-progress jobs
Time · department · sender · duration
Poll the existing job ID
06 / FAILURE HANDLING
Retry after a restart starts a new job from retained audio; it does not resume inference at a saved checkpoint.
| Failure | Implemented behavior |
|---|---|
| Diarization fails | Continue with the transcript without speaker labels |
| Summary API fails | Save the transcript with a summary-failure notice |
| Notion delivery fails | Retain minutes locally and record the delivery error separately |
| Server restarts mid-job | Restore the job record as interrupted; retry if source audio remains |
07 / DATA FLOW
Google SSO identifies the user; the app lists and opens meetings created by that user. Notion uses separate department delivery routes. Local audio processing is distinct from sending transcript text to an external summary API.
The public demo runs on sample data. Internal recordings, transcripts, customer information, and operational credentials are excluded.
08 / EVIDENCE
A Sep 15, 2026 review of implementation and change history confirms reconnection, interrupted-job records, and partial-result retention paths. The current internal RTX 4090 service is separate from the public UI demo.
The historical “56-minute file, about 28 seconds” observation covers chunked diarization only. It is not an end-to-end or repeated benchmark. Recorded usage appears in the monthly statistics. Human time savings, satisfaction, and stage-level success rates have not been measured.
ENGINEERING DECISIONS
Long GPU processing lives in a server job while the UI polls its ID. If the upload response is lost, the client looks for a matching existing job and reconnects.
Diarization failure can fall back to a transcript without speaker labels; summarization failure preserves the transcript. Generated minutes and Notion delivery errors are recorded separately.
Implemented reconnection and retry paths do not establish a recovery success rate. A done status can coexist with summary or external-storage failure, so stage outcomes must be counted separately.
SCOPE & LIMITS
South Korea · Korean / English