Skip to content

Releases: luongndcoder/Scribble

v1.2.15

30 May 16:25

Choose a tag to compare

  • ✨ Trợ lý AI giờ là tùy chọn — chỉ cần STT vẫn dùng đầy đủ
  • 🌐 Phát hiện mất mạng & thông báo mượt hơn
  • 🎨 Tinh gọn giao diện Cài đặt và thanh điều khiển
  • ⚡ Ổn định hiển thị biên bản + một số cải thiện nhỏ

v1.2.14

30 May 01:32

Choose a tag to compare

  • 🌐 Phát hiện mất mạng tự động + banner cảnh báo trong khi upload
  • 🔁 Soniox upload tách 2 bước (upload riêng → STT riêng) an toàn hơn
  • ⚡ Auto-retry chunk fail với backoff thông minh (1s → 2s → 4s)
  • 📜 Transcript dài 4h+ không còn lag (sliding window + auto-load)
  • 👥 Speaker IDs sequential 1-2-3-4 (hết cảnh nhảy 3 → 101)
  • 💾 Crash giữa upload không mất tiến trình — có nút "Thử lại"
  • ⏱ Hiển thị stage rõ: "Đang tải file" vs "Soniox đang xử lý"

v1.2.11

28 May 13:59

Choose a tag to compare

  • 🎬 Tự động cài ffmpeg — không cần brew install / choco install nữa
  • 🪟 Sửa lỗi không kéo được cửa sổ app trên Mac
  • 📝 Transcript luôn được lưu kể cả khi tạo biên bản AI lỗi (chưa cấu hình API Key) — không còn cảnh "công cốc"
  • 🧹 Auto-xóa cuộc họp rỗng khi upload lỗi (hết bug "đã tồn tại" giả)
  • 🔄 Soniox tự reconnect khi session timeout (~1h) + transcript dài 4h không còn lag

v1.2.10

28 May 03:36

Choose a tag to compare

Scribble v1.2.10 — Soniox Auto-Reconnect & Transcript Load-More

🐛 Bug Fixes

STT realtime ổn định cho meeting dài (Soniox)

  • Trước: Soniox real-time WebSocket có session cap server-side (~1h tùy plan). Khi vượt, server đóng kết nối nhưng app không biết — transcript dừng đột ngột trong khi timer vẫn chạy, audio thread chết âm thầm.
  • Giờ: app tự reconnect tới 8 lần với exponential backoff (cap 5s). Timeline start_ms/end_ms được giữ liên tục qua các session bằng cumulative offset. Frontend hiện badge 🔄 Soniox session reconnecting... trong ~1s khi đang nối lại. Lỗi rõ ràng nếu hết quota / sai API key (không còn nuốt âm thầm).

Transcript dài 4h không còn lag

  • Trước: render full transcriptParts (500+ đoạn × split-sentence × translation) làm DOM lag kinh khủng khi cuộc họp dài.
  • Giờ: pagination — chỉ render 200 đoạn cuối, nút "↑ Tải thêm 200 đoạn cũ hơn" ở đầu, scroll position được preserve. Export / Copy / Tạo biên bản vẫn lấy TOÀN BỘ transcript (pagination chỉ ảnh hưởng render).

Auto-scroll không yank user nữa

  • Trước: cứ có transcript mới là kéo scroll xuống bottom → khó đọc đoạn cũ khi đang ghi âm.
  • Giờ: chỉ auto-scroll khi user đang trong 80px cuối list. Cuộn lên đọc thoải mái.

📦 Downloads

  • macOS (Apple Silicon): .dmg hoặc auto-update
  • Windows (x64): .exe installer
  • Linux (amd64): .AppImage hoặc .deb

v1.2.9

26 May 05:30
2a32652

Choose a tag to compare

🎙️ Soniox realtime — speaker attribution + timestamps (the actual fix)

User report: dùng Soniox STT realtime, text đúng nhưng speaker labels bị lẫn lộntimestamps stuck ở 0:00 – 0:00 đặc biệt trong session dài.

Root cause

  1. Speaker jumbling. SonioxRealtimeStreamer.results() chỉ update current_speaker ở cuối loop event. Khi 1 event Soniox trả [S1, S2, S1] tokens trong cùng batch, guard "speaker change" check accumulated_final = [] (chưa merge) nên không flush — tất cả tokens collapsed vào speaker cuối cùng.

  2. Timestamps = 0:00. Backend không forward start_ms / end_ms của Soniox tokens cho realtime. Frontend fall back state.seconds từ recording timer, race với WS open → events đầu arrive lúc seconds=0 → cả startTime lẫn endTime pin về "0".

Fix

  • Rewrite token loop trong src-python/stt.py: flush speaker change INLINE, current_speaker advance per-token. Track segment_start_ms / segment_end_ms từ token offsets thực, gửi trong mọi event.
  • Frontend (use-streaming-stt.ts) prefer ms offsets từ backend khi có, fallback state.seconds cho Nvidia/STT khác.

Verify

Long session với 3+ speakers: speaker labels stable, timestamps grow đều (vd: 2:34 – 3:12). Log sẽ thấy [stt:soniox-stream] Speaker change mid-event: S1 -> S2, flushing: '...' khi đổi giọng giữa event.

v1.2.8

15 May 11:41
3bab6f9

Choose a tag to compare

🖱️ Drag window from the topnav (the actual fix)

Previous attempts wired data-tauri-drag-region everywhere, but the attribute is silently ignored on Tauri 2 + macOS Overlay-titlebar — confirmed via user testing. Switched to Tauri's recommended manual approach: an onMouseDown handler that imperatively calls getCurrentWindow().startDragging().

What changed

  • Click-drag anywhere in the topnav (other than buttons / language toggle / settings cog) moves the window
  • Double-click the topnav background triggers toggleMaximize() — mirrors native title-bar behavior
  • Interactive elements (buttons, links, inputs) still get their onClick — drag handler bails out when the target is one of those

macOS — first "silent update" test

This is the first release after v1.2.7's stable-cert work, so it's the proof point for the TCC permissions fix. Updating from v1.2.7 → v1.2.8 should NOT trigger a macOS permission dialog (mic, system audio). Both releases are signed with the same Scribble Code Signing identity, so TCC sees them as the same app.

If you DO still get prompted, something in the cert chain changed between builds — open an issue.

v1.2.7

15 May 11:02
a105017

Choose a tag to compare

🔐 macOS — permissions now persist across updates

Stop being asked for mic + system-audio permissions every time you update. The fix is on the build side: every macOS release is now signed with a stable code-signing identity, so macOS TCC recognises each update as "the same app" and keeps prior grants alive.

What changed

  • .github/workflows/build-macos.yml imports a code-signing cert from secrets and uses it as signingIdentity instead of ad-hoc (-). Falls back to ad-hoc when the secret is absent, so non-mac builds aren't affected.
  • Identity extraction tolerates self-signed certs (the strict codesigning policy filter rejects them, but codesign itself accepts them by name).

Heads-up — one last permission prompt

Upgrading from v1.2.6 → v1.2.7 will still trigger the macOS permission dialog one more time (mic, system audio), because v1.2.6 was ad-hoc-signed and v1.2.7 has a real identity — different designated requirement = different "app" to TCC.

From v1.2.7 onward, every future update will keep your permissions. No more annoying prompts.

Verification

codesign -dvv /Applications/Scribble.app 2>&1 | grep Authority
# Expected: Authority=Scribble Code Signing  (NOT: Authority=(ad-hoc))

v1.2.6

15 May 08:33
f20817e

Choose a tag to compare

🔐 Soniox realtime — round two (the actual fix)

v1.2.4 fixed the websockets.sync bundle gap. The Soniox realtime WebSocket then progressed further but immediately died on TLS handshake:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: unable to get local issuer certificate

Root cause

Python's stdlib ssl module uses compile-time hardcoded CA paths (/System/Library/OpenSSL/cert.pem etc) that don't exist in a PyInstaller bundle. The file-upload path was never affected because httpx ships certifi's CA bundle internally — but websockets.sync falls back to the raw stdlib and broke.

Fix

  • main.py: at the very top of boot (before uvicorn, websockets, or anything caches an SSL context), set SSL_CERT_FILE / SSL_CERT_DIR / REQUESTS_CA_BUNDLE to certifi.where(). Guard with sys.frozen so dev runs still use the system trust store.
  • scribble-sidecar.spec: collect_all('certifi') so cacert.pem is actually present in the bundle. Previously certifi was only there incidentally via httpx; now it's explicitly required and load-bearing.

After this update

Settings → STT Provider = Soniox → "Cuộc họp mới" → start recording → transcript appears in real time, with built-in speaker diarization.

📦 Downloads

  • Scribble_1.2.6_aarch64.dmg — macOS Apple Silicon
  • Scribble_1.2.6_x64-setup.exe — Windows x64
  • Scribble_1.2.6_amd64.AppImage — Linux x64 (AppImage)
  • scribble_1.2.6_amd64.deb — Linux x64 (Debian/Ubuntu)

v1.2.5

15 May 07:52
5b9b44e

Choose a tag to compare

🪟 Sticky meeting-list header

Tiny UX fix on top of v1.2.4.

What changed

  • Meeting history title + search bar now stay pinned at the top while you scroll the meeting cards
  • Previously the whole .view was the scroll container — scrolling past the first screen lost the title, the "Upload file" / "Cuộc họp mới" buttons, AND the search field together
  • The .meetings-grid is now the only scrolling region inside the list view; detail view is unaffected (uses its own layout)

📦 Downloads

  • Scribble_1.2.5_aarch64.dmg — macOS Apple Silicon
  • Scribble_1.2.5_x64-setup.exe — Windows x64
  • Scribble_1.2.5_amd64.AppImage — Linux x64 (AppImage)
  • scribble_1.2.5_amd64.deb — Linux x64 (Debian/Ubuntu)

🔗 Quick recap of v1.2.x changes

Version Highlight
1.2.5 Sticky meeting-list header + search (this release)
1.2.4 Soniox realtime fix + draggable window + clickable links
1.2.3 Clickable markdown links in update modal
1.2.2 Real markdown renderer + bottom-right banner + drop "Ready" toast
1.2.1 Auto-update infra (signing + manifest + Settings controls)
1.2.0 Audio upload + reference materials + UX redesign

v1.2.4

15 May 07:27
2c5eae2

Choose a tag to compare

🐛 Fixes

This is a triple-bugfix release covering window controls, clickable docs links, and the broken Soniox realtime transcription that several users reported after v1.2.3.

🎤 Soniox realtime transcription works again

  • Root cause: the PyInstaller bundle was missing websockets.sync (only speedups.so got packed). The Soniox SDK imports from websockets.sync.client import connect for realtime sessions — every WebSocket attempt threw ModuleNotFoundError and was silently swallowed by an empty except. Frontend looped reconnect 2x/sec.
  • Fix: spec uses collect_all('websockets') now, pulling every submodule. The Soniox file-upload path was never affected because it uses HTTP (httpx), not WebSockets.
  • Also added: log.error(..., exc_info=True) on the soniox-stream exception path. Future failures will show a real traceback instead of going silent.

🪟 Window draggable from the topnav

  • macOS overlay title-bar mode hid the native chrome — clicking on "Scribble v1.2.x" just selected the version text. Same on Windows/Linux.
  • Fix: topnav, brand, status chip, and language label all get data-tauri-drag-region + -webkit-app-region: drag + user-select: none. Click-and-drag the topnav to move the window. Buttons opt out of drag with no-drag so their onClick still fires.

🔗 Clickable markdown links actually open

  • v1.2.3 added [text](url) rendering in the update modal but routed through @tauri-apps/plugin-shell without granting the permission. Click did nothing visible.
  • Fix: shell:allow-open added to capabilities. Click any release-notes link → opens in your system browser.

📦 Downloads

  • Scribble_1.2.4_aarch64.dmg — macOS Apple Silicon
  • Scribble_1.2.4_x64-setup.exe — Windows x64
  • Scribble_1.2.4_amd64.AppImage — Linux x64 (AppImage)
  • scribble_1.2.4_amd64.deb — Linux x64 (Debian/Ubuntu)