- New watcher.py: polls WATCH_DIR, enqueues transcription+summary via Celery.
- New process_watch_file_task in tasks.py.
- Updated __main__.py: WebUI always runs; MCP and watcher run in parallel when enabled.
- Configurable summary prompts via ENV or file; stronger default prompt.
- New docx_styles.py: converts markdown (headings, bullets, bold/italic) to DOCX.
- Updated create_summary_docx to use markdown-aware styling.
- New docx_cover.py: reusable cover page for transcript and summary.
- Cover pages enabled when COVER_PAGE_ENABLED=true.
- New mcp_server.py: FastAPI app for LLMs to upload audio and get transcript JSON.
- Added process_mcp_transcribe_task Celery task.
- Updated __main__.py: WebUI always runs; MCP server runs in parallel when MCP_SERVER_ENABLED=true.
- Prepare transcript into pages of 29 lines each before writing.
- Each line max 60 chars total (48 content + number + spaces).
- Words preserved (no clipping); wrap at word boundaries.
- Page break after every 29 lines.
- No distinction between logical/visual lines.
- Insert page break after every 29 visual lines.
- Wrap content at 58 characters, keeping whole words together.
- Ensure no text is lost; all transcript text is included.
- Insert page break after every 29 visual lines.
- Wrap long lines instead of truncating to preserve all words.
- No text is dropped; content wraps onto new lines as needed.
- Integrate chunking into LocalAI client to avoid GPU OOM on long audio.
- Split long files into overlapping chunks; transcribe each chunk; merge segments with corrected timestamps.
- Auto-enable chunking when audio duration > LOCALAI_MAX_SINGLE_REQUEST_DURATION (default 300s).
- Add env variables:
LOCALAI_CHUNK_DURATION (default 180)
LOCALAI_CHUNK_OVERLAP (default 2)
LOCALAI_MAX_SINGLE_REQUEST_DURATION (default 300)
- Add unit and integration tests for chunking logic.
- Confirmed working end-to-end with vibevoice-cpp-asr on 88-minute file.
- Use 29 visual lines per page before inserting a page break.
- Use w:pageBreak element for reliable page breaks across editors.
- Restart line numbering at 1 on each new page.
- Insert page break after 45 visual lines.
- Reset line counter so each page starts at 1.
- Uses embedded line numbers for consistent behavior across editors.
- Split long lines into multiple visual lines at word boundaries.
- Each visual line is its own paragraph with its own embedded line number.
- Continuous numbering across speakers and pages.
- Portable across Word, LibreOffice, Google Docs.
- Remove w:lnNumType; line numbers are now plain text in each paragraph.
- Ensures first line is always '1' across Word, LibreOffice, Google Docs.
- Each paragraph: line number + tab + content.
- Remove docGrid element to prevent phantom grid-based line offset.
- Ensure exactly one lnNumType element (no duplicates).
- First visible line on page 1 now correctly numbered as 1.
- Ensure single column layout (cols num='1')
- Set explicit single line spacing (before/after=0, line=240 twips)
- Prevents Word from counting extra lines due to spacing/columns
- Clean, single-pass implementation for transcript and summary DOCX
- Explicit margins, font, line numbering per OOXML spec
- Disable docGrid to prevent off-by-one line numbering
- Ensure first content line is line 1
- Ensure Subject header is set on the outermost MIME part when attachments are present
- Restructure send_email to use multipart/mixed as root with headers when attachments exist
- Remove unsupported 'enable_api' argument from app.launch()
- Hide API link via CSS instead
- Remove queue-position paragraph from upload_notification_template.html
- Remove send_success_email/send_error_email from email_sender.py
- Centralize subject logic in tasks.py using _get_subject()
- Use EMAIL_SUBJECT_SUCCESS and EMAIL_SUBJECT_ERROR with clear defaults
- Ensure subject is always set and logged before sending
- Generate PDFs by:
- Creating individual .docx components (cover, transcript, summary)
- Converting each .docx to PDF
- Merging PDFs in correct order
- Adding page numbers to final PDFs
- Transcribe & Summarize:
- Attach: JSON, transcript MD, summary MD, TRANSCRIPT.pdf, SUMMARY.pdf, COMBINED.pdf
- Transcribe only:
- Attach: JSON, transcript MD, TRANSCRIPT.pdf
- Ensure transcript line numbering is isolated to its own .docx before PDF merge
- Rename 'Transcript & Summarize' to 'Transcribe & summarize'
- Increase title font size to 60px via CSS
- Set 'Identify speakers' checkbox to default selected
- Use EMAIL_SUBJECT_SUCCESS env var for success emails
- Use EMAIL_SUBJECT_ERROR env var for error emails
- Provide safe defaults if env vars are missing or blank
- Add final guard in send_email() to prevent blank subjects