9Video

Có gì mới

0.13.0

2026-09-03

Features

  • brand-kit: make a kit creatable without a video, and divergence detectable (db99503)
  • brand: Brand Kit form picks a Theme instead of raw colour/font fields (d720011)
  • brand: build the three preview samples out of the real render templates (5f9df7a)
  • brand: edit a kit next to the frame it produces (11e5296)
  • brand: give brand kits and themes a place of their own in the app (e80de4b)
  • brand: give brand kits and themes one owner in the renderer (ffd5977)
  • brand: let a chosen theme reach the first build, not just the editor (f49fddd)
  • brand: make the 24 built-in themes a starting point instead of a dead end (94c2eb5)
  • brand: preview a kit or theme as the frame it actually renders as (57cb6ce)
  • desktop: add AuthController for Google login state machine (c76af20)
  • desktop: add LoginStep component and i18n copy (705aae8)
  • desktop: add me:upgradeWaitlist IPC handler (c3aaf0f)
  • desktop: add plan section to Settings (18b0852)
  • desktop: add plan to AppSettings (0bf76f6)
  • desktop: add Plan type and shouldWatermark fail-closed gate (c4529de)
  • desktop: add renderWatermarkOverlay (8b82d13)
  • desktop: add required googleAuth readiness check (188038a)
  • desktop: add serverClient — getProfile/completeOnboarding/recordEvent (34270d7)
  • desktop: add SurveyStep component and i18n copy (13f9615)
  • desktop: add syncPlanStatus (7acb034)
  • desktop: add telemetry event names and extend onboarding to 5 steps (adb920f)
  • desktop: add UserProfile.plan and requestUpgradeWaitlist() (bf5bd82)
  • desktop: dev-only skip for onboarding's login+survey steps (f5fb742)
  • desktop: đóng gói CHANGELOG.md và lộ nó qua IPC (1002fb0)
  • desktop: expose auth/onboarding-survey IPC methods on window.api (9553512)
  • desktop: expose plan status + upgrade waitlist on window.api (7f8a728)
  • desktop: gate the watermark on plan at render time (4483a18)
  • desktop: modal Có gì mới sau khi cập nhật (5827ff8)
  • desktop: name the failing token pairing in the re-author hint (cdc130d)
  • desktop: parser cho CHANGELOG.md và luật hiện modal có-gì-mới (c8da8be)
  • desktop: record video_created/video_exported/render_error telemetry (38fe2a5)
  • desktop: register ninevideo:// protocol, wire AuthController and auth/onboarding IPC (cc5d3c1)
  • desktop: show a plan badge in the sidebar for pro/agency (580337a)
  • desktop: sync plan on login/startup, close settings:save plan hole (4669ce1)
  • desktop: wire mandatory login + survey steps into onboarding flow (945d090)
  • editor: say when a video has drifted from its kit, and offer both ways out (38b19fe)
  • nav: route Brand Kit and Theme to separate pages (9bdc00f)
  • nav: split the "Brand" rail item into Brand Kit and Theme (ef698d6)
  • server: add activation rate, DAU, and D7 retention KPI queries (4592cd1)
  • server: add AdvanceDripStep command handler with catch-up semantics (889a099)
  • server: add BullMQ drip-emails queue and processor (6874295)
  • server: add CaptureLead command and POST /leads for landing-page capture (f632afa)
  • server: add CompleteOnboarding command handler and OnboardingCompletedEvent (fa5e852)
  • server: add DripCampaign aggregate with D0/D3/D7/D14/D21 schedule logic (efd417a)
  • server: add GET /telemetry/kpis (activation, DAU, D7 retention) (3fcf06e)
  • server: add GetUserProfile query handler (7f5206c)
  • server: add Google OAuth sign-in, JWT auth guard, and /me endpoints (2b0c610)
  • server: add grant-plan manual plan-grant script (61c30dd)
  • server: add hourly cron scan that enqueues drip campaigns with a step due (1977ef9)
  • server: add IDripCampaignRepository port, MikroORM adapter, and drip_campaign migration (b83820c)
  • server: add ITelemetryEventRepository port, MikroORM adapter, and telemetry_event migration (1686e18)
  • server: add IUserRepository port, MikroORM adapter, and users table migration (dceee8d)
  • server: add Lead aggregate, repository, and migration (df9fd23)
  • server: add Lead.userId and the upgrade_waitlist source (759aa0c)
  • server: add MailPort, Resend adapter, and drip email templates (1e18a7f)
  • server: add plan field and grantPlan() to User (3c99d13)
  • server: add POST /me/upgrade-waitlist (210a941)
  • server: add RecordEvent command handler and UserSignedUp-to-telemetry subscriber (e7b7883)
  • server: add shared-kernel Result type and Email value object (71d761e)
  • server: add SignInWithGoogle command handler and UserSignedUpEvent (7881872)
  • server: add TelemetryEvent aggregate and event-name enum (976d3f9)
  • server: add User aggregate and OnboardingSurvey to Identity domain (bac19c3)
  • server: capture a Lead when UpgradeWaitlistRequestedEvent fires (d0db899)
  • server: CaptureLeadCommand accepts and backfills userId (2192c21)
  • server: compose IdentityModule and register it in AppModule (8886833)
  • server: compose TelemetryModule and add POST /telemetry/events (c33750d)
  • server: enable CORS for POST /leads and graceful shutdown hooks (695f8b8)
  • server: migrate users table for plan column (6c5fa11)
  • server: RequestUpgradeWaitlistCommand publishes UpgradeWaitlistRequestedEvent (4338068)
  • server: return plan from GET /me (0a170a5)
  • server: scaffold NestJS app with health endpoint (d9dc214)
  • server: start DripCampaign on OnboardingCompleted and convert Lead on UserSignedUp (e246354)
  • server: validate required env vars with Joi at boot (3d209e3)
  • server: wire MikroORM + Postgres/Redis docker-compose, add DB health check (4f0dadf)
  • settings: persist the user's own themes; delete a field that documents a guard that isn't there (af8b236)
  • theme: let a user's own palette be a saved thing, not a per-video re-edit (2ec0d3f)
  • theme: stop the theme matcher from claiming a preset it only coincides with (7e3ce8d)

Bug Fixes

  • add server/.env.example and unignore .env.example pattern (c145c20)
  • auth: suppress orphaned-promise rejection, guard getStatus() decrypt throw (8fd485f)
  • brand-kit,theme: add fallback names when sanitized name is blank (abb465d)
  • brand-kit: clear meta.brandKitId when a theme or preset is applied over a kit (5d3b7c1)
  • brand-kit: strip a stale kit id from drafts written before the source fix (d51679b)
  • brand: close final-review findings — persist migration, warn on theme delete (5fca335)
  • brand: close the pre-merge review's six findings on the Brand Kit page (da664c2)
  • brand: compute Brand Kit saves against current state, not a stale render closure (ab7d59e)
  • brand: re-measure preview on resize, fit the page to the viewport (997d53a)
  • brand: revert the preset picker to a list, make side columns responsive (3618659)
  • brand: stack preview+form below a container-query breakpoint (b237190)
  • brand: stop clipping the right column and match the editor's inspector polish (cd7de58)
  • brand: stop the kit branch from outliving a theme/preset applied over it (63e8265)
  • build: make SERVER_URL genuinely build-time overridable (5ede57a)
  • build: register ninevideo:// URL scheme in packaged builds (e32ad26)
  • clarify telemetry error handling in comment (6535ddc)
  • composer: reframe the Brand Kit chip as "Diện mạo" (Look), not identity (4f9c983)
  • create: drop the colour preview from the Recipe chip entirely (8870a29)
  • create: make the Brand Kit page's theme pick one-shot (689cd48)
  • create: preserve staged composer state across Create navigation (72fc280)
  • create: resolve the Brand Kit chip's swatch through the kit's theme (6cc587b)
  • create: tint the recipe preview swatches with the active Brand Kit (66a5735)
  • crm: establish MikroORM RequestContext for cron/queue call sites (5b9a135)
  • crm: prevent BullMQ unhandled 'error' crashes in drip-emails queue (1c07b3a)
  • crm: retry drip-emails jobs with exponential backoff (b747dc4)
  • desktop,server: guard cold-start getSecret, fix TDZ, unify plan gate, add upgrade-waitlist e2e coverage (48508a8)
  • desktop: add missing create.readiness.items.googleAuth i18n copy (0d41dc6)
  • desktop: address final-review nits on the Vietnamese TTS prompt tweak (abc49dc)
  • desktop: enlarge free-tier watermark overlay for visibility (d34c56b)
  • desktop: fail a tween aimed at an element the html gives no size (d3fdcb5)
  • desktop: keep DevTools closed by default in dev (a52a72c)
  • desktop: nhận heading em-dash trong CHANGELOG.md và bỏ hardcode mục mới nhất trong test (ebf2b63)
  • desktop: nudge Vietnamese narration away from unnecessary English words (90a952b)
  • desktop: repair a double quote nested in an inline style attribute (f3de263)
  • desktop: scale watermark overlay to match render resolution (ad93da2)
  • desktop: stop render_error telemetry from leaking local paths (da7a7c5)
  • desktop: tell the scene author z-index cannot fix an overlap (a4bdc07)
  • desktop: time out a hung Google login attempt (3592970)
  • desktop: update AuthController comment and test fixtures to the corrected scheme (9e34fde)
  • desktop: wrap auth/onboarding-survey IPC errors in AppError (36cd76f)
  • editor: extract brand-drift arbitration into a tested divergenceState (6be89d9)
  • editor: saveVideoAsKit reads the freshly-built themes list, not a stale closure (4ffe653)
  • editor: update InspectorVideo's kit/theme call sites for themeId kits (b330e58)
  • generate: resolve a selected Brand Kit's colours via its linked theme (71c8379)
  • main: add Electron's single-instance lock (9777129)
  • main: guard recordTelemetry sync getSecret throw (2c61bc6)
  • replace convoluted type with simple TestingModule annotation (8b48c14)
  • server: encapsulate onboarding field and validate email in User entity (a572b26)
  • server: fix docker-compose api connectivity to postgres/redis (d1b0e2e)
  • server: map domain errors to HTTP status codes (ec4cba0)
  • server: pin exact versions and add ESLint config (f7ab2cd)
  • server: restore full typecheck coverage for api-frontend and shared-kernel (6dd412a)
  • server: run migrations against the built dist output, not TS sources (674d172)
  • server: type QueryBus.execute and log errors in event subscribers (378683e)
  • server: use a syntactically valid custom URL scheme for the OAuth callback (7d651f5)
  • settings: migrate legacy colour-owning brand kits to themeId references (40026f0)

Performance Improvements

  • telemetry: add indexes on telemetry_event for KPI queries (4a138f6)

0.12.0

2026-08-08

Có gì mới

Brand Kit giờ thực sự tô lên video. Trước bản này, chọn một kit ở màn Tạo chỉ là gợi ý cho AI lúc viết kịch bản — màu và phông của video vẫn lấy từ bảng màu AI tự nghĩ ra. Cái chip nói "đã áp dụng", còn video thì không. Nay kit quyết định màu, phông, và logo của bạn hiện trên mọi cảnh. Kèm theo đó, "video này dùng kit nào" trở thành một câu hỏi duy nhất, ghi trên chính video, thay vì lẫn với "kit mặc định của tôi là gì" — và một video có thể thôi dùng kit, việc trước đây không có cách nào làm.

Phần lớn thông báo "Lỗi kỹ thuật" ở cảnh AI hoá ra không phải lỗi của AI. Bản này truy từng cái một, mỗi cái dựng lại đúng cảnh đã hỏng để xem thủ phạm thật là gì. Kết quả gần như đều chỉ về phía app:

- Dải thương hiệu và lớp phụ đề do app vẽ vẫn bị tính là lỗi của cảnh. Tác giả cảnh không nhìn thấy hai lớp đó, nên có viết lại bao nhiêu lần cũng không sửa được — một tên thương hiệu hơi dài đủ để đánh trượt cả năm cảnh. - Bộ luật màu của app tự mâu thuẫn: một chỗ bảo mọi cảnh vẽ nền chuyển sắc, chỗ khác hứa chữ phụ đọc được — trên nền *khác*. Cảnh làm đúng cả hai thì rớt. - CSS của app rò vào cảnh: một cảnh đặt tên center cho thẻ của mình liền bị kéo giãn ra phủ một góc khung, chôn mất ba khối nội dung của chính nó. - Và nặng nhất: ví dụ mẫu app đưa cho AI đang dạy đúng cái app chấm rớt — tô chữ tiêu đề bằng màu thương hiệu. Đo trên các bản nháp đã lưu, 23 trong 71 cảnh gần nhất dính đúng lỗi đó.

Khi một cảnh vẫn hỏng, giờ nó hỏng nhanh hơn và nói rõ hơn. App kiểm được vài loại lỗi ngay trên mã nguồn cảnh — trước khi mở trình duyệt để đo — nên những lần thử lại vô ích được cắt sớm. Và lời nhắn gửi lại cho AI nêu luật bị vi phạm, không chỉ triệu chứng; trước đây nó chỉ nhận lại con số đo được nên cứ viết lại đúng cái sai cũ cho hết lượt.

Chữ tiếng Việt bị vỡ thành nư�c. Đây không phải lỗi phông. Nhà cung cấp AI trả về ký tự hỏng sẵn khi một chữ cái nhiều byte bị cắt đôi — mất luôn, không khôi phục được. App nay nhận ra và gọi lại, vì lần sinh sau gần như không hỏng ở đúng chỗ ấy. Các bản nháp đã lưu vẫn giữ vết hỏng cũ, phải sửa tay.

Từ bản này, app tự chấm tài liệu của chính nó. Mọi ví dụ mẫu và mọi mẫu cảnh dựng sẵn đều phải đi qua đúng cái cổng mà chúng dạy cảnh khác vượt — kiểm cả trên một bảng màu tối lẫn một bảng màu sáng, vì lỗi vừa rồi *qua* được màu mặc định và chỉ rớt ở màu khác. Ngay lần chạy đầu, cổng này bắt thêm hai lỗi nằm sẵn trong mẫu cảnh của app.

Chưa đo được bản sửa cắt bớt bao nhiêu lượt dựng lại trên video thật — nhưng khác các bản trước, giờ đã có thước: app đếm được tỉ lệ cảnh dính từng loại lỗi trên toàn bộ bản nháp đã lưu, nên bản sau sẽ nói được bằng con số thay vì bằng cảm giác.

Features

  • brand: make a chosen Brand Kit actually paint the video, logo included (87b3ad4)
  • editor: surface the technical reason behind a failed scene build (3a4ed17)

Bug Fixes

  • brand-kit: one question — does THIS video use a kit? (c23d765)
  • composition: give every custom scene the shared base background (7c7d992), closes #000 #stage
  • composition: namespace the shell's utility classes so a scene cannot collide with them (9af6d28)
  • composition: stop one scene's stray close tag from blanking the rest (c888a1b), closes #stage #stage #hex
  • llm: one background, one budget, one timing owner, and no trusted input (541798f)
  • llm: re-request a reply the provider mangled instead of rendering it into the video (c53a3ed)
  • scene-author: say that the DOM never changes state, and name both sides of a collision (f5755f2)
  • scene-author: stop teaching the failure, and reject a fragment that carries no CSS (7a09984)
  • scene-author: the recommended background wash is not a surface muted copy can sit on (96ada99), closes #8A8C93 #7866B8 #1D4ED8 #1D4ED8 #0D204D
  • ui: label things by what they are, and make 87 drafts findable (cb5f0ef)
  • verify: fail a tween whose selector matches nothing, before the browser run (4a2d10b)
  • verify: stop failing scenes for the app's own overlay, fonts and assertions (36c22a4)
  • verify: stop failing scenes on our own assertion, and name the rule on retry (f82fb29)

0.11.0

2026-08-06

Có gì mới

Làm lại từ đầu chỉ bằng một nút. Cài đặt → Hệ thống có thêm mục "Vùng nguy hiểm" với nút Đặt lại ứng dụng: app xoá cấu hình cùng khoá API của bạn, tự khởi động lại, và mở ra ở màn hướng dẫn như lần đầu cài. Hữu ích khi bạn muốn dựng lại từ con số không, đổi sang khoá khác, hay bàn giao máy cho người khác.

Video của bạn không bị đụng tới, trừ khi bạn tự yêu cầu. Trong hộp thoại xác nhận có một ô tích riêng — *"Xoá luôn video đã xuất và bản nháp"* — và nó mặc định tắt. Muốn xem lại màn hướng dẫn là chuyện thường; vứt bỏ toàn bộ video đã render thì không, mà trên một máy dùng thật đó có thể là vài GB không lấy lại được. Hai việc đó tách hẳn nhau, không gộp làm một.

Nhật ký lỗi cũng không bị xoá — nếu việc đặt lại hỏng giữa chừng thì đó là thứ duy nhất còn lại để tìm nguyên nhân.

Features

  • settings: add an app reset that restarts into onboarding (18854ba)

0.10.1

2026-08-06

Có gì mới

Xuất video giờ chạy được mà không phải cài thêm gì. Trước bản này, máy nào chưa tự cài sẵn FFmpeg thì mọi lần bấm Xuất đều hỏng — và app còn khuyên "thử lại", một lời khuyên vô nghĩa vì thiếu công cụ thì bấm bao nhiêu lần cũng vậy.

Điều trớ trêu: app vẫn luôn đóng gói sẵn FFmpeg, chỉ là nó không bao giờ đến được bộ dựng. Bộ dựng chạy như một tiến trình riêng và tự đi tìm công cụ trên máy, còn app thì chưa từng chỉ đường cho nó; bản thân file lại nằm trong kho nén nên có chỉ cũng không chạy được; và FFprobe — thứ bộ dựng cũng cần — chưa từng được đóng gói. Bản này nối cả ba lại. Bộ cài nặng thêm khoảng 18MB, đổi lấy việc máy sạch cũng xuất được video.

App không còn tự đốt hạn mức AI của bạn. Khi nhà cung cấp báo hết lượt, app từng thử lại liên tục trong vài giây — mà mỗi lần thử lại cũng bị tính vào đúng cái hạn mức vừa hết. Với gói miễn phí (20 lượt/ngày) thì một lần hỏng biến thành hàng chục lượt mất trắng. Giờ app đọc đúng khoảng chờ nhà cung cấp đưa ra: chờ được thì chờ, còn hết hạn mức thật thì dừng ngay thay vì phá tiếp. Nhân tiện phát hiện thư viện bên dưới âm thầm nhân mỗi lần gọi thành ba — cũng đã tắt.

Cảnh AI bớt phải dựng đi dựng lại. Hai nguyên nhân cũ đã được gỡ. Prompt từng vừa cấm dùng font ngoài, vừa đòi chọn font đặc trưng, lại không hề nói font nào có sẵn — nên AI đoán, và đoán sai thì cảnh bị dựng lại. Giờ prompt chỉ đề xuất đúng những font bộ dựng cấp được. Cùng với đó là kiểu tiêu đề tô gradient: chữ dạng đó thực chất không có màu, nên bộ kiểm luôn báo chữ tàng hình dù nhìn vẫn đẹp — nay đã được thay bằng cách đặt gradient ra nền phía sau.

Hai thay đổi cuối nhắm vào nguyên nhân truy được từ log thật, nhưng vẫn chưa đo được chúng cắt bớt bao nhiêu lượt dựng lại — như bản trước, cần vài video thật mới biết.

Bug Fixes

  • llm: stop retrying a rate limit that has already been spent (85bec0e)
  • llm: stop the prompt asking for fonts and text fills that fail the gate (f33f968)
  • render: ship ffmpeg AND ffprobe to the renderer, so export works (a2c27e5)

0.10.0

2026-08-05

Có gì mới

Bản trước hứa rằng bạn không phải chọn model — app sẽ dùng model mặc định của nhà cung cấp. Hoá ra không hề có thứ đó: model để trống chỉ là để trống, và nhà cung cấp trả về lỗi. Người dùng mới vì thế kẹt ngay tại màn hướng dẫn, đúng lúc vừa dán khoá xong. Bản này làm cho lời hứa đó thành thật.

- Chọn nhà cung cấp là có luôn model chạy được. 9cre · Claude · OpenAI · Gemini đều đã kèm sẵn một model mặc định, điền vào ngay lúc bạn chọn — cả ở màn hướng dẫn lẫn trong Cài đặt. Muốn đổi thì vào "Model theo công việc"; app không bao giờ ghi đè model bạn đã tự chọn. MiniMax · GLM · OpenRouter chưa có sẵn, bạn tự điền một lần. - Máy mới không còn tự mọc ra một tài khoản lạ. Lần chạy đầu tiên từng đẻ sẵn một tài khoản OpenAI bạn chưa hề tạo rồi đặt nó làm mặc định. Hệ quả kín đáo hơn: tài khoản thật bạn thêm vào sau đó không bao giờ được chọn làm mặc định, nên mọi việc cứ lặng lẽ chạy nhầm chỗ. - Báo lỗi nói đúng lý do. Khoá Gemini hết quota hay sai địa chỉ từng chỉ hiện 429 status code (no body) — một câu không cho biết gì cả. Giờ app hiện nguyên văn lý do từ nhà cung cấp. Trường hợp chưa chọn model cũng được nói thẳng, thay vì đẩy ra một mã lỗi khó hiểu.

Phần dựng cảnh bằng AI được siết ở hai chỗ vẫn hay khiến một cảnh phải dựng đi dựng lại rồi vẫn hỏng. Khi một cảnh không qua kiểm tra, lượt dựng lại giờ được xem chính đoạn HTML nó phải sửa — trước đó nó chỉ nhận lại mô tả cảnh kèm một câu than phiền, nên mỗi lượt lại viết ra một cảnh mới toanh và hỏng ở một chỗ khác. Và prompt giờ nói rõ giá trị màu thật của giao diện thay vì để AI tự đoán: trước đây nó tự bịa ra bảng màu rồi yên tâm rằng chữ đủ tương phản, trong khi lúc render lại ra màu khác hẳn — nên cảnh trượt kiểm tra tương phản dù mọi màu đều lấy từ đúng biến giao diện.

Hai thay đổi đó nhắm vào nguyên nhân đã truy ra từ log thật, nhưng chưa đo được chúng cắt bớt bao nhiêu lượt dựng lại — cần vài video thật mới biết.

Features

  • settings: give each provider preset a working default model (3d619ab)

Bug Fixes

  • llm: give the scene prompt the real theme colours instead of five blanks (8406430), closes #161B22 #8B949E #stage
  • llm: surface the provider's real error instead of "(no body)" (f401646)
  • onboarding: give the account it creates a real model (59b75b8)
  • pipeline: let a scene re-author see the html it must fix (8891378)
  • settings: stop fabricating an LLM account on a fresh install (cd05064)
  • settings: treat Gemini's models/ prefix as the same model (f891b71)

0.9.0

2026-08-03

Có gì mới

Lần đầu mở 9Video giờ có người dẫn đường. Trước đây app thả bạn thẳng vào màn Tạo với một ô mời gõ chủ đề — gõ xong bấm Tạo mới biết là app chưa có khoá AI, rồi tự đi tìm chỗ cắm. Giờ app hỏi trước, kiểm giúp bạn, và đưa thẳng tới video đầu tiên.

- Ba bước là xong. Bước 1 giới thiệu app. Bước 2 chọn nhà cung cấp AI (9cre · Claude · OpenAI · Gemini · MiniMax · hoặc tự điền địa chỉ) rồi dán khoá của bạn. Bước 3 chọn: xem một video mẫu, hay tự viết chủ đề. App không hỏi ngôn ngữ, giọng đọc, khung hình hay Brand Kit ở đây — để dành tới lúc bạn đã thấy nó chạy. - Không phải chọn model. App dùng model mặc định của nhà cung cấp. Muốn đổi thì vào Cài đặt sau. - Một lần bấm kiểm cả khoá lẫn máy. Bấm "Kiểm tra & tiếp tục", app thử khoá của bạn và soát luôn những thứ cần có trên máy để dựng video (FFmpeg, giọng đọc, bộ công cụ dựng). Mục nào chưa đạt thì app chỉ cách khắc phục, không chỉ báo đỏ. - App không tự kiểm khi chưa được bấm. Mỗi lần kiểm là một lượt gọi AI tính tiền vào khoá của bạn, nên app chỉ chạy khi bạn chủ động bấm. - Máy còn thiếu gì thì dừng lại ở bước 2 — đi tiếp lúc đó cũng chỉ gặp một nút bấm không được. Nhưng khoá của bạn đã được lưu rồi: thoát ra cài phần còn thiếu, quay lại bấm "Kiểm lại" là xong, không phải dán khoá lần nữa, và lần bấm đó không tốn thêm lượt gọi AI nào. - Muốn bỏ qua lúc nào cũng được. Nút "Để sau" có ở cả ba bước, bấm là vào app ngay. Màn hướng dẫn chỉ hiện đúng một lần, không nhắc lại. - Xem lại được trong Cài đặt. Mục "Danh sách sẵn sàng lần đầu" của bản trước nay là "Xem lại hướng dẫn". Xem xong thoát ra thì về lại đúng Cài đặt. - Xem lại khi đã cắm khoá thì bước 2 chỉ còn kiểm máy — app cho biết đang dùng tài khoản nào và một nút kiểm tra, không hỏi khoá nữa. Đổi khoá hay đổi nhà cung cấp là việc của Cài đặt → AI & Model, để bạn không lỡ tạo thêm một tài khoản trùng. - Video mẫu chỉ một cú bấm. App tự dựng cho bạn một video ~30 giây để xem nó chạy ra sao. Video này dựng hoàn toàn bằng đồ hoạ nên không cần khoá Pexels. - Đủ tiếng Việt, Anh, Pháp và Tây Ban Nha.

Thẻ "danh sách sẵn sàng" từng nằm trong màn Tạo đã được gỡ — màn hướng dẫn này thay chỗ nó. Mấy lỗi lộ ra khi chạy thật cũng đã sửa: kéo được cửa sổ trong lúc xem hướng dẫn (màn này chiếm trọn cửa sổ nên trước đó không còn chỗ nào để vuốt di chuyển); không còn lỡ dựng hai video mẫu cùng lúc — mỗi video là một lượt gọi AI tính tiền thật; bấm "Kiểm lại" nhiều lần không còn tạo ra một loạt tài khoản thừa trong Cài đặt; video mẫu chạy được thật sau khi app báo thành công (trước đó app lưu khoá nhưng quên chuyển sang dùng nó, nên bấm tạo là lỗi ngay); và khi xem lại hướng dẫn, app không còn thoáng hiện ô nhập khoá trước lúc nhận ra bạn đã có tài khoản — bấm trúng lúc đó là bỏ rơi tài khoản bạn đang dùng.

Features

  • onboarding: add pure step and visibility logic (3032d4e)
  • onboarding: add the first-run screen container (6c6777d)
  • onboarding: add the three first-run step components (5ac6665)
  • onboarding: gate the app shell behind the first-run screen (100e532)
  • settings: add onboardingSeenAt (9283380)
  • settings: replace the checklist row with a way back to onboarding (3ffe61f)

Bug Fixes

  • create: stop StrictMode from starting two sample video builds (e6700d4)
  • onboarding: activate the saved account, fix the replay path, and make the window draggable (571b0d6)
  • onboarding: don't render the editable connect step before the account lookup settles (264265a)
  • onboarding: let recheck finish without re-billing the LLM probe (397f7bf)
  • onboarding: let replay actually test and save a newly typed key (1d3f692)
  • onboarding: stop step 2 from ever editing an LLM account (a736e4c)

0.8.1

2026-07-31

Bug Fixes

  • build: ship sharp's native binaries in the packaged app (b985f53)

0.8.0

2026-07-30

Có gì mới

Bản này gỡ một giả định nữa nằm sẵn trong app từ đầu: video không còn bị đúc theo một khuôn kịch bản duy nhất. Trước đây mọi chủ đề — review điện thoại, giới thiệu công ty hay ôn tập từ vựng — đều đi qua cùng một mạch mở đầu/nội dung/kêu gọi. Giờ bạn chọn một công thức đúng với loại video mình đang làm, ngay trên màn Tạo.

- 12 công thức, chia theo 6 nhóm ngành. Review sản phẩm và Mở hộp nhanh (Affiliate & Review); Bán sản phẩm và Trước & sau (Bán hàng); Giải thích khoa học và Dòng thời gian (Khoa học & Tài liệu); Giới thiệu công ty và Case study (Doanh nghiệp); Hướng dẫn từng bước và Thẻ ghi nhớ (Giáo dục); Truyền cảm hứng và Nhật ký hành trình (Lifestyle). Mỗi công thức cố định một mạch 5–6 cảnh, mỗi cảnh một nhiệm vụ riêng — Case study chẳng hạn đi qua: khách hàng → thách thức → cách làm → kết quả đo được → chốt. Vẫn có "Không dùng" nếu bạn muốn để AI tự quyết cấu trúc như trước. - Công thức giao việc cho từng cảnh, không viết sẵn lời. Nó nói đại ý "cảnh này phải cho thấy sản phẩm làm được đúng việc nó được mua để làm", còn lời đọc vẫn do AI viết từ chủ đề của bạn. Đây là chủ ý: một công thức mô tả sẵn nội dung sẽ đẩy AI bịa ra thông số và số liệu mà chủ đề của bạn không hề đưa. - Chọn công thức là đặt luôn thời lượng và bộ màu. Thời lượng nhảy tới mức công thức được thiết kế cho (30–60 giây tuỳ công thức), theme mặc định lấy đúng bộ màu ngành của công thức — hoặc bản pha theo Brand Kit nếu bạn đã chọn một bộ, nên dải màu xem trước ở thẻ công thức chính là màu video sẽ dùng thật — và gợi ý chủ đề mẫu trong khung nhập đổi theo. Quay lại "Không dùng" thì thời lượng trả về đúng giá trị bạn có trước khi áp công thức đầu tiên. - Không đặt được thời lượng ngắn hơn mức công thức chịu nổi. Vì công thức cố định số cảnh: chọn quá ngắn thì mỗi cảnh bị co xuống mức sàn 2 giây và video thành một chuỗi ảnh nháy thay vì dài đúng như bạn đặt. App tự kéo lên mức ngắn nhất mà công thức còn giữ được mạch. - Công thức nào cần cảnh quay thật thì app nói trước. 4 trong 12 công thức (Review sản phẩm, Mở hộp nhanh, Trước & sau, Nhật ký hành trình) dựa vào tư liệu quay thật, và app nhắc bạn cắm Pexels key để tận dụng. 8 công thức còn lại dựng hoàn toàn bằng đồ hoạ nên chạy tốt mà không cần key nào. - Tên và mô tả của cả 12 công thức có đủ tiếng Việt, Anh, Pháp và Tây Ban Nha, kèm chủ đề mẫu riêng cho từng công thức.

Hai lỗi giao diện cũng được sửa: màn hình chờ lúc mở app không còn đứng hình — phần hoạt hoạ chạy hết sau khoảng một giây trong khi splash được giữ ít nhất 2,5 giây, để lại thanh tiến trình nằm im ngoài rãnh dù app vẫn đang khởi động; giờ nó chạy vòng lặp cho tới lúc app mở. Và một tiêu đề nháp quá dài không còn làm vỡ bố cục màn Tạo với màn Nháp: nó từng nong cả trang rộng ra quá khung 1040px, kéo theo mọi mục khác kể cả thẻ nhập chủ đề, đến mức trang trôi ngang.

Danh sách kiểm tra lần đầu có trong phần thay đổi bên dưới nhưng đang tắt ở bản này: phần việc đã dựng xong rồi tạm ẩn sau một cờ để hoàn thiện thêm, nên màn Tạo không hiện thẻ đó và mục bật lại nó trong Cài đặt cũng ẩn theo. Lúc thẻ bị tắt thì app cũng không chạy kiểm tra FFmpeg, Edge TTS hay Pexels nào.

Features

  • create: pick a video recipe before generating (4f54121)
  • create: replace the flat setup banner with a first-run checklist (a4f4971)
  • llm: let a recipe supply the narrative arc (1e523f1)
  • onboarding: gate the first-run checklist behind ONBOARDING_ENABLED (3271dce)
  • readiness: add pure first-run readiness state (326eb1d)
  • recipe: add the industry video-recipe catalog (39b0945)
  • recipe: name and describe every recipe in four locales (f99d738)
  • recipe: record the chosen recipe on the storyboard (cffbd59)
  • recipe: stamp the recipe's own theme as the storyboard default (4c54095)
  • settings: add a way back to the dismissed first-run checklist (f6a3106)

Bug Fixes

0.7.1

2026-07-29

Bug Fixes

  • editor: repair inspector panel overflow, add collapsible sidebar (33dd62a)
  • sidebar: move collapse toggle out of nav into a quiet header control (cb74ab1)

0.7.0

2026-07-29

Features

  • brand: freeze logo files inside app storage (38efac3)
  • brand: split Brand Kit into its own module with a named-list model (902ac27)
  • composition: emit the full theme token set on #stage (1cfd129)
  • composition: paint built-in scenes from theme tokens (c961dad)
  • composition: resolve stage tokens from the stamped theme preset (c3f0814), closes #FFFFFF
  • create: choose a Brand Kit before generating (aa5b200)
  • editor: manage multiple named Brand Kits with logos (195a8f3)
  • editor: pick themes by industry family and mode (02bb259)
  • improve video quality and brand workflow (0ce6897)
  • llm: teach the scene author the full theme token set (4bbed1d)
  • settings: store named Brand Kits with legacy migration (b5bdc51)
  • theme: add semantic token set and back-compat derivation (1b5f66d)
  • theme: add WCAG contrast maths (ae11072)
  • theme: expand catalog to 24 presets across six industry families (5093ee7)
  • theme: identify the active preset by id, not by hex compare (eef81c9)

Bug Fixes

  • brand-kit: guard optimistic revert against out-of-order save rejections (7f94dff)
  • brand-kit: route brand text through injection guard, stamp themeId everywhere, use sentinel ids (c9d5d0c)
  • brand: hash logo filenames and drop SVG from allow-list (3809aac), closes #7c5cff #7C5CFF
  • brand: stop kit ids/fonts from LLM text, close logo-pick race, revert on save failure (f441367)
  • close five whole-branch review findings (theme contrast, brand kit sync, fontFamily injection, legacy contrast warning, karaoke pill contrast) (d008c33)
  • llm: make scene few-shot examples practice the theme-token rule they teach (e920979), closes #fff #94a3b8 #7c5cff #1a1f2b #0b0e14 #20233a #191033 #0b0e14
  • storyboard: stop fontFamily re-validation from bricking existing drafts (f81b112)
  • theme: close mid-luminance crossover contrast gaps in deriveTokens (b25c9de), closes white/#0B0E14 #0B0E14 #0B0E14
  • theme: make deriveTokens degrade instead of failing contrast for any input (eff2667), closes #FACC15 #07111F #6C6C6C #FFFFFF
  • theme: pin legacyTokens onPrimary to white for back-compat (e9c9058), closes #FACC15 #0B0E14 #fff
  • theme: resolve stage tokens from actual colours, not a stale preset (3edfd13)

0.6.1

2026-07-26

Có gì mới

Bản 0.6.1 sửa lỗi Edge TTS báo kết nối bình thường trong phần chẩn đoán nhưng vẫn có thể làm hỏng cả lượt tạo video. Nguyên nhân là lời đọc chứa ký tự đặc biệt như & hoặc < bị đưa thẳng vào SSML, khiến máy chủ đóng kết nối trước khi trả audio. 9Video giờ mã hoá an toàn các ký tự này trước khi tổng hợp, nên những nội dung như tên tính năng, thương hiệu hoặc câu có ký hiệu đặc biệt vẫn được đọc và xuất video bình thường.

Bug Fixes

  • tts: escape narration before SSML synthesis (3de4000)

0.6.0

2026-07-26

Có gì mới

Bản 0.6.0 tập trung vào độ ổn định của giọng đọc, phụ đề và các bước chờ khi tạo video.

- Chẩn đoán Edge TTS bằng audio thật. Mục Hệ thống giờ tạo một đoạn audio thử nghiệm qua đúng kết nối WebSocket mà app sử dụng. Edge TTS luôn hiện cạnh FFmpeg với trạng thái Chưa kiểm tra, Đang kiểm tra, thành công hoặc lỗi; khi thất bại, app gợi ý kiểm tra mạng, VPN và tường lửa. - Báo cáo hệ thống gọn và đúng nhu cầu của 9Video. Chẩn đoán không còn đưa Docker, HyperFrames được đóng gói sẵn, thông số máy hoặc các engine tùy chọn vào danh sách khiến người dùng tưởng phải cài thêm. Chỉ những thành phần ảnh hưởng trực tiếp đến việc dựng video mới được hiển thị. - Phụ đề khớp lời đọc hơn. Video chỉ hiện một dòng phụ đề đúng thời điểm, còn phần xem trước sử dụng timing của audio đã cache nên không bị chạy trước hoặc chậm hơn giọng đọc. - Màn hình tạo video dễ thao tác hơn. Các nút hành động trong khu vực theo dõi tiến trình được dời khỏi vùng dễ bị che hoặc chồng lấn.

Features

  • settings: diagnose Edge TTS connectivity (95b42e1)

Bug Fixes

  • captions: show one timed line at a time (8b7ca0b)
  • preview: sync captions with cached voice timing (9f8591e)
  • settings: scope diagnostics to app dependencies (883b04c)
  • ui: offset generation theater actions (d06722a)

0.5.0

2026-07-25

Có gì mới

Bản 0.5.0 giúp 9Video dễ dùng hơn từ lúc mở app, chọn giọng đọc cho tới khi quản lý video đã tạo. Những tuỳ chọn chưa sẵn sàng cũng được ẩn đúng lúc để tránh bấm nhầm rồi gặp lỗi.

- Giao diện có 4 ngôn ngữ. Có thể đổi trực tiếp giữa Tiếng Việt, English, Español và Français trong Cài đặt. Menu, trình tạo video, màn dựng, trình sửa, thông báo tiến trình và lỗi hệ thống đều đổi theo ngôn ngữ đã chọn. - ElevenLabs dễ cài đặt và an toàn hơn. Sau khi nhập API key, app chỉ hiện danh sách giọng và cho chọn giọng khi kết nối đã thành công. Có thể tìm giọng theo tên hoặc Voice ID, nghe thử, thêm Voice ID riêng và tải lại danh sách từ tài khoản ElevenLabs. - Chọn được model ElevenLabs. Cài đặt hỗ trợ Flash v2.5 (nhanh, tiết kiệm) và Eleven v3 (biểu cảm, chất lượng cao). Khi dùng v3, tuỳ chọn tốc độ được tự động ẩn vì model này không hỗ trợ điều chỉnh speed theo cách cũ. - Phụ đề bám theo lời đọc. Kiểu highlight mới làm nổi từ đang được đọc; phụ đề cũng luôn nằm trên nội dung cảnh, không còn bị footage hoặc hiệu ứng che mất. - Quản lý nội dung dài dễ hơn. Thư viện video, Thư viện tài nguyên và Bản nháp đều có phân trang. Header luôn ở trên khi cuộn, thanh chuyển trang luôn ở dưới để không phải kéo về đầu hoặc cuối danh sách. - Xem lại video có đủ thông tin. Màn phát video hiện đúng thời lượng, số cảnh và độ phân giải của thành phẩm, đồng thời có nút quay lại rõ ràng. - Trải nghiệm mở app và viết kịch bản mượt hơn. Thêm màn khởi động có chuyển động và tinh chỉnh hiệu ứng khi AI đang viết kịch bản, giúp các bước chờ dễ theo dõi hơn. - Trình sửa ổn định hơn. Menu chọn cảnh và dropdown không còn bị timeline hoặc khung inspector che/cắt; đổi giọng sẽ tạo lại audio để phần nghe thử luôn khớp với lựa chọn mới.

Features

  • app: add animated startup splash (f2a580b)
  • captions: add spoken-word highlight style (c5212f6)
  • drafts: add paginated drafts library (9ae5710)
  • i18n: add catalog and literal guards (b6d9ef9)
  • i18n: add live language selector and localize shell (72d1cad)
  • i18n: add locale foundation and persistence (1e73139)
  • i18n: localize generation theater and cinema (ea90d90)
  • i18n: localize primary views and date formats (ee69fec)
  • i18n: localize settings composer and activity (dab9677)
  • i18n: localize studio editor (c035f79)
  • i18n: structure IPC errors and native dialogs (9af96cd)
  • i18n: structure job progress messages (b15f939)
  • i18n: support four video languages and voices (185c8f4)
  • library: màn xem lại hiện số liệu thật (thời lượng · cảnh · độ phân giải) (15b45e9)
  • theater: polish script writing animation (089bc98)
  • tts: add searchable ElevenLabs voice catalog (f14a24d)
  • tts: configure ElevenLabs models safely (dbed54b)
  • ui: add sticky page navigation (f6d4859)

Bug Fixes

  • composition: phụ đề luôn trên nội dung cảnh (cô lập stacking .scene) (2c4a275)
  • editor: keep scene menus above the timeline (5950941)
  • editor: keep select menus inside inspector (fb73947)
  • editor: regenerate audio after voice changes (c12139f)
  • player: add back navigation (92407a7)
  • shell: show the current app version (cc243b0)

0.4.0

2026-07-23

Có gì mới

Bản này lo một chuyện đã âm ỉ từ lâu: hình phải đúng chủ đề, và bạn phải làm chủ được hình. Footage giờ khớp với lời đọc thay vì minh hoạ chung chung, ảnh bạn đính kèm được AI dùng đúng ý, và cảnh AI dựng không còn ném một khối HTML vào mặt người dùng phổ thông.

- Footage khớp với lời đọc, hết cảnh "một từ chung chung". Trước đây câu truy vấn person typing laptop cafe bị băm thành ba từ rời, mỗi từ tải một clip, rồi render chỉ lấy clip đầu — nên cảnh nào cũng đang minh hoạ cho mỗi chữ "person". Nay bộ tìm clip chạy thang truy vấn theo cụm, để AI nhìn thumbnail chấm điểm, rồi xếp hạng theo độ khớp và thời lượng, lọc trùng — mỗi cảnh nhận đúng một clip hợp ý, không hai cảnh dùng chung một clip. - Cả video một tông màu. AI chọn một tông màu chung (color grade) áp cho mọi clip footage, nên các cảnh stock không còn vênh màu nhau. - Hết chữ lạc ngôn ngữ trên hình. Mọi từ khoá tìm Pexels đi qua hàng rào ASCII (không còn bắn tiếng Việt vào URL), và chữ trang trí hiện trên hình giờ theo đúng ngôn ngữ của video. - Ảnh bạn đính kèm, AI tự quyết cách dùng. Bỏ nút chọn vai trò "Trong video ↔ Tham chiếu" (nhãn 9px vốn bị cắt cụt thành Trong vid...). Mỗi ảnh giờ tới model vừa nhìn được vừa đặt được — model toàn quyền quyết: đưa lên hình như một clip, hay chỉ mượn màu/bố cục/chủ thể làm tham chiếu, hay không dùng. - Ảnh của bạn cũng biết chuyển động. Trước ảnh nào cũng nằm im full-bleed sau caption y như một clip Pexels. Nay model có thể đặt ảnh thành một lớp trong cảnh motion và dựng bố cục quanh nó, không chỉ làm nền. - Chế độ chuyên sâu cho trình sửa. Mọi cảnh AI dựng đều là HTML tự do, nên mở ra là thấy ngay một khối code — đúng thứ làm người dùng phổ thông hoang mang. Nay trình sửa ẩn code HTML/GSAP ở chế độ cơ bản; sửa hình cảnh AI bằng câu chữ qua ô "Tạo bằng AI". Cần đụng code thì bật công tắc Chế độ chuyên sâu ở thanh trên (có gợi ý khi cảnh chứa mã tuỳ chỉnh). - Phụ đề an toàn và dễ đọc hơn. Chữ lùi vào vùng an toàn ~18% và đặt trên nền pill tương phản cao — rõ trên mọi nền footage. - Dựng tiếp cả cảnh footage. Bộ tìm footage giờ chạy như một worker trong hàng đợi dựng cảnh và tự lưu như cảnh HTML; thoát app giữa chừng, mở lại vẫn dựng nốt các cảnh footage còn nợ. Thẻ cảnh footage trong sân khấu hiện khung hình thật.

Features

  • assets: module giải ảnh đính kèm, đọc được thì cho model nhìn (f581046)
  • build: hàng đợi dựng cảnh nhận thêm worker tìm footage (6d9e8aa)
  • build: nối bộ tìm footage vào hàng đợi dựng cảnh và autosave (670a438)
  • captions: safe zone ~18% + nền pill tương phản cao (22a7db9)
  • composition: cảnh custom trỏ ảnh người dùng qua token, không qua đường dẫn (55285db)
  • draft: ảnh người dùng có thể thành cảnh motion, không chỉ ảnh nền (10ad797)
  • draft: áp clip đã chốt vào cảnh, và tính đúng nợ của cảnh footage (a0e2f0c)
  • draft: autosave gộp clip đã chốt vào draft như gộp cảnh đã dựng (24467d5)
  • editor: công tắc Chế độ chuyên sâu ở thanh trên + context provider (76c9db8)
  • editor: CustomEditor ẩn HTML/GSAP ở chế độ cơ bản, gợi ý khi có mã (5ef9d13)
  • editor: hai lớp phủ HTML ẩn ở chế độ cơ bản, gợi ý khi có mã (3ca5d6f)
  • editor: module pref Chế độ chuyên sâu + phát hiện mã tuỳ chỉnh (4e41495)
  • llm: AI chọn tông màu chung cho mọi clip footage (16b4fa2)
  • llm: ảnh đính kèm vừa nhìn được vừa đặt được, model tự quyết dùng (e3e1f50)
  • llm: model chọn ảnh làm nền hay làm một lớp trong cảnh motion (009cb1f)
  • llm: tác giả cảnh biết dựng bố cục quanh ảnh người dùng (45bec55)
  • plan: tách cảnh ảnh-người-dùng khỏi cảnh cần tìm footage (782c7a4)
  • resume: dựng lại cảnh footage còn nợ sau khi thoát app giữa chừng (7a1c301)
  • stock: bộ tìm clip chạy thang truy vấn rồi để vision chấm thumbnail (8710411)
  • stock: prompt và parser cho bước vision chấm thumbnail (fa66ab8)
  • stock: thang truy vấn Pexels theo cụm, chặn chữ Việt lọt vào URL (9fa0ee4)
  • stock: xếp hạng ứng viên clip theo slug, thời lượng và lọc trùng (0ea1342)
  • theater: thẻ cảnh footage hiện khung hình thật, trình sửa nhận clip (a9d6256)
  • ux: trả nợ theater/export — crossfade cảnh, chặn xuất-hai-lần, bar theo transform (cae950b)

Bug Fixes

  • build: vá 6 lỗi review của bộ chọn footage có vision (85c76d3)
  • composer: bỏ nhãn vai trò dưới ảnh đính kèm, chỉ còn thumbnail (8f9dd12)
  • editor: nút tải ở tab Render không còn bị đẩy ra ngoài rồi cắt mất (67a968d)
  • editor: saveAdvanced ra ngoài updater (StrictMode gọi updater hai lần) (7ab182d)
  • footage: lỗi Pexels không còn im lặng, và editor không bắn tiếng Việt vào Pexels (ceeabe0)
  • footage: onWarn hỏng không làm findFootage ném, thumbnail hỏng được báo (7445ee7)
  • footage: sàn thời lượng theo cảnh, danh sách còn nợ và id clip sống sót (5d7eab1)
  • llm: design system về system prompt, và chữ trên hình theo ngôn ngữ video (d238fc1)
  • llm: vệ sinh fontTitle/fontBody và language trước khi vào system prompt (00e2afc)
  • pipeline: sửa lỗi review ở buildSession — comment lạc chỗ, usedIds rò null, thiếu test verify/resume (fd13f50)
  • shared: siết guard fail-closed trong parsePick, tránh bắt oan văn xuôi hợp lệ (2715674)
  • stock: mọi từ khoá qua hàng rào ASCII, thumbnail thu nhỏ thay vì cắt (0b67eba)
  • stock: parsePick lấy thẻ <pick> CUỐI thay vì thẻ đầu, fail-closed khi cụt (1193d9c)
  • theater: thẻ cảnh hiện đúng khung hình, nút hành động lên đỉnh (e5b3ee8)

0.3.0

2026-07-21

Có gì mới

Bản này đổi hẳn cảm giác lúc tạo video: từ "bấm rồi ngồi nhìn thanh tiến trình" thành xem AI dựng phim ngay trước mắt, nghe được giọng đọc trước khi xuất.

- Sân khấu tạo video thay cho thanh tiến trình. Vào sân khấu ngay lúc bấm Tạo, trước cả lượt IPC đầu tiên: orb thở theo nhịp, AI gõ lại ý bạn vừa nói, từng cảnh hiện thành thẻ hai hồi, rail bên cạnh tường thuật đang làm tới đâu. - Nghe được giọng đọc trong trình sửa. Trước đây giọng chỉ tồn tại _sau_ khi xuất video. Nay TTS chạy song song lúc dựng cảnh, nên nghe thử được trước. Cache khoá theo nội dung — sửa lời là đọc lại, không phát câu cũ. - Bỏ chọn giọng khỏi form tạo. Chưa nghe gì thì chưa có cơ sở để chọn. Giọng suy từ ngôn ngữ, AI tuyên bố trong recap, đổi được trong trình sửa (có nghe thử). Ngôn ngữ ở lại vì đó là quyết định về nội dung, không phải tuỳ chọn kỹ thuật. - Buổi chiếu và màn xuất video. Render xong đi thẳng vào buổi chiếu thay vì thêm một dòng trong danh sách: chrome lùi ra, video dâng vào giữa; hết video hiện thành phẩm kèm số liệu. Xuất chỉ một cú bấm, mp4/webm lui vào tuỳ chỉnh nâng cao, tiến trình có ETA. - Màn Tạo kiểu composer như Claude · ChatGPT · Gemini: hàng chip là quyết định đã chốt sẵn (bấm mới đổi) thay cho thẻ tuỳ chọn bắt buộc, kèm đính kèm ảnh. Ngôn ngữ và số cảnh giao cho AI; chip thời lượng quy thẳng ra ngân sách ký tự lời đọc. - Hết tiếng "tạch" và lặp vài chữ cuối khi nghe thử. Một gốc chứ không phải hai lỗi: timeline GSAP chỉ dài tới tween cuối, ngắn hơn video, nên vòng lặp phát không bao giờ kết thúc và giật audio về mỗi khung hình. - Cảnh dùng footage nay cũng có giọng — trước chỉ 4/7 cảnh có tiếng, vì đường dựng audio bám nhầm danh sách "cảnh cần dựng HTML". - Bản tải về mở được trên máy người khác. Cả .dmg lẫn .zip đã ký Developer ID, notarize và staple, không còn cảnh báo Gatekeeper. - Nâng nền tảng: Electron 31 → 43 (để HyperFrames 0.7.64 chạy), React 19, Vite 7, Vitest 4, TypeScript 6, zod 4, openai 6, electron-builder 26 — kèm gỡ 9 lỗ hổng bảo mật từ chuỗi phụ thuộc.

Features

  • audio: nối cache giọng đọc vào main và đường xuất video (M3 wiring) (b3d6e89)
  • audio: sinh giọng đọc trong lúc dựng cảnh, render dùng lại (M3 backend) (1ae52f5)
  • build: sign, notarize and staple the .dmg after packaging (9a5e915)
  • cinema: buổi chiếu và màn xuất video (WOW #4 + #5) (a7ff135), closes #000
  • create: composer kiểu chip + đính kèm ảnh, AI tự chọn ngôn ngữ/độ dài (4fd9d54)
  • llm: plan mở đầu bằng recap nói lại ý user (7146eac)
  • preview: nghe được giọng đọc trong trình sửa (M5) (cb418f0)
  • theater: đọc plan JSON khi còn đang stream (c2611d9)
  • theater: hiện giọng đọc ở rail và bỏ chọn giọng khỏi form tạo (WOW #3) (f03cd1b)
  • theater: nhịp trung thực cho provider không stream tăng dần (f839972)
  • theater: orb thở và recap gõ ra màn hình (WOW #1) (e32662a)
  • theater: reducer thuần gộp draft:stream và onSceneStatus (9e8d3fa)
  • theater: sân khấu tạo video thay progress bar (WOW #1+#2) (cc11c7a)
  • theater: subscribe hook for draft:stream + onSceneStatus (bebcf59)
  • theater: thẻ cảnh hai hồi và rail tường thuật (WOW #2) (a6e7f35)

Bug Fixes

  • build: notarize via afterSign hook, not electron-builder's bundled copy (1c88ebe)
  • llm: đừng render mảng tween thành cảnh, và siết recap về một cái liếc (9b9e988)
  • preview: hết tiếng "tạch" và hết lặp vài chữ cuối (c021c17)
  • theater: 0-base scene index and filter by build session in useTheaterStream (2395168)
  • theater: allow late scene retries through instead of a terminal-done drop (533f61a)
  • theater: clear buildingIndex on settle so retries reclaim the row (e2efcef)
  • theater: dọn nốt các Minor còn treo trong ledger (a1ccc66)
  • theater: dòng rail chỉ nói "đang dựng" khi thật sự đang dựng, và đóng khe autosave trước khi mở editor (9fd1628)
  • theater: drop stale-ref session filter in useTheaterStream (5e119c3)
  • theater: khoá cảnh theo sceneId và không bao giờ hiện nội dung đã bị vứt (bb6f31b)
  • theater: reach the written phase and make phase transitions one-way (7a6df44)
  • theater: unescape \r \b \f in streaming recap and cover plan-stream invariants (c51d9e4)
  • ui: chặn hàng hoạt động tràn ra ngoài panel và sidebar (2a8a677)
  • voice: cảnh footage cũng có giọng, và hết phát lại từng mảnh (1e035cc)
  • voice: stamp the chosen voice into the storyboard so TTS uses it (b6bdf87)

Các thay đổi đáng chú ý của 9Video. Bản mới nhất ở trên cùng.

0.2.0

2026-07-20

Bản này xoay quanh một điều: tạo video không còn mất việc. Mọi tác vụ giờ chạy trong nền, theo dõi được từ mọi màn hình, và tự lưu để sống sót qua việc đổi tab hay tắt app.

Tính năng mới

- Không mất việc khi rời màn hình. Viết kịch bản, dựng cảnh và xuất video giờ chạy nền — đổi tab, mở Thư viện hay bấm chỗ khác đều không làm gián đoạn. (Trước đây rời màn hình Tạo là job đang chạy bị huỷ luôn.) - Thanh Hoạt động. Một khu vực ghim ở đáy thanh bên cho thấy việc đang chạy, hàng đợi và kết quả gần đây từ bất kỳ màn hình nào; huỷ hoặc đổi thứ tự ngay tại đó. - Tự lưu bản nháp. Storyboard được lưu ngay khi tạo, mỗi cảnh dựng xong được ghép vào bản nháp — tắt app giữa chừng, mở lại vẫn còn nguyên phần đã làm. - Dựng tiếp bản bị gián đoạn. Sau khi tắt app lúc đang dựng dở, mở lại thấy nút "Dựng tiếp" để dựng nốt các cảnh còn thiếu; app biết cảnh nào đã xong, cảnh nào chưa nên không cho Xuất nhầm. - Xếp hàng xuất video. Bấm xuất nhiều video, chúng chạy lần lượt một cái một. - Thông báo khi xong. Việc chạy nền hoàn tất trong lúc bạn ở màn hình khác sẽ báo cho bạn. - Kịch bản chất lượng hơn. Thư viện ví dụ mẫu theo ngữ cảnh và các ví dụ few-shot giúp AI dựng cảnh đẹp và đúng hướng hơn. - Phụ đề rõ trên mọi nền footagechỉnh màu cả video cho tư liệu stock.

Sửa lỗi

- Hết lỗi 524 khi tạo video dài — luôn stream trên đường truyền để tránh gateway timeout giữa chừng. - Huỷ tạo kịch bản giờ huỷ thật — trước đây nút Huỷ chỉ đổi trạng thái còn AI vẫn chạy tới hết. - Nhãn việc dựng cảnh hiện đúng chủ đề video thay vì một đoạn mã spec khó hiểu. - Xuất video lỗi giờ báo rõ lý do ngay trong tab Xuất. - Bảng Hoạt động liệt kê mọi việc đang chạy, không chỉ một; mở panel không còn tự đóng ngay khi một việc vừa xong. - Nhiều sửa lỗi ổn định cho tự lưu, huỷ tác vụ, và thoát app giữa chừng.