Local-first là gì và tại sao dữ liệu của bạn nên ở trên máy bạn

local-firstprivacyE2E encryptionSQLitebrand-phase-3trust
Local-first là gì và tại sao dữ liệu của bạn nên ở trên máy bạn

Local-first là gì và tại sao dữ liệu của bạn nên ở trên máy bạn

Trên màn hình điện thoại bạn có khoảng 80 app. Bao nhiêu trong số đó đang upload dữ liệu của bạn lên cloud của họ ngay bây giờ? Câu trả lời: hầu như tất cả. Mira đã chọn không đi theo đường đó. Đây là lý do tại sao.

”Cloud-first” là default của tech 10 năm qua

Khoảng từ 2012 đến giờ, gần như mọi app bạn cài đều mặc định gửi dữ liệu lên server của họ trước, rồi mới hiển thị lại cho bạn. Lý do thì hợp lý theo góc nhìn kỹ sư: server mạnh hơn điện thoại, đồng bộ nhiều thiết bị dễ hơn, fix bug bằng cách deploy lại backend dễ hơn là bắt user update app.

Còn theo góc nhìn business: dữ liệu nằm trên server của họ thì họ kiểm soát bạn. Bạn không trả tiền? Khoá. Bạn muốn đổi sang app khác? Export khó hoặc không có. Bạn muốn xoá hết? Họ nói có xoá, bạn tin thôi chứ không kiểm tra được.

Mô hình này không xấu một cách tuyệt đối. Gmail, Google Docs, Figma — chúng nó cần cloud để hoạt động. Nhưng có một câu hỏi mà ít ai dừng lại để hỏi: với một app ghi chú cảm xúc, một app theo dõi thói quen, một app nhật ký — tại sao dữ liệu đó phải nằm trên server của một công ty xa lạ?

Vấn đề của cloud-first, nhìn từ phía bạn

Có ba thứ thực sự không ổn.

Thứ nhất: rò rỉ dữ liệu. Năm ngoái Việt Nam có một vụ leak dữ liệu của một app fintech với hàng triệu user — không nêu tên vì đã đủ đau cho người trong cuộc, nhưng chuyện đó cho thấy mô hình cloud-first không miễn phí. Khi dữ liệu của hàng triệu người tập trung một chỗ, đó là một “honeypot” — mật ngọt cho cả hacker bên ngoài lẫn nhân viên có quyền truy cập bên trong. Bạn càng nhạy cảm với loại dữ liệu (sức khoẻ tâm lý, tài chính, vị trí), rủi ro càng cao.

Thứ hai: app đóng cửa, dữ liệu biến mất. Google đã đóng hàng trăm sản phẩm trong 15 năm qua. Các startup nhỏ thì còn nhiều hơn. Bạn ghi chép trong một app suốt 3 năm, một sáng mở ra thấy banner “chúng tôi shutdown ngày 30/6, cảm ơn”. Export ra một file JSON không ai biết đọc, hoặc không có export. Ký ức của bạn — đi theo.

Thứ ba: bị giam dữ liệu của chính mình. Bạn hết subscription Premium? Một số app khoá luôn cả phần đọc. Bạn không trả thêm thì không xem lại được những gì bạn đã viết. Về mặt pháp lý có thể họ vẫn “cho phép xem”, nhưng thực tế thì bạn phải trả tiếp để truy cập thứ bạn tự tạo ra. Logic này, nếu áp dụng cho một cuốn sổ tay giấy, sẽ là: bạn mua cuốn sổ, viết vào đó, rồi tháng sau nhà sản xuất sổ tới khoá nó lại đòi tiền hàng tháng. Vô lý. Nhưng với software, nhiều người đã quen.

Vậy “local-first” là gì

Cụm từ này đến từ một paper năm 2019 của Ink & Switch — nhóm research của Martin Kleppmann và một số người khác, tên paper là “Local-first software: You own your data, in spite of the cloud”. Không phải Mira nghĩ ra, và bài đó đáng đọc nếu bạn quan tâm.

Local-first nghĩa là ba thứ, gói lại đơn giản:

Một, dữ liệu primary nằm trên thiết bị của bạn. Không phải “cache trên máy + bản thật trên server” như cloud-first. Mà ngược lại — bản thật ở trên máy bạn, server (nếu có) chỉ là một bản phụ.

Hai, cloud — nếu app có dùng — chỉ làm nhiệm vụ backup hoặc sync giữa các thiết bị của chính bạn. Cloud không phải là “source of truth”. Mất mạng vẫn dùng được đầy đủ. Server công ty sập, dữ liệu bạn vẫn còn nguyên.

Ba, bạn có thể export và mang dữ liệu đi bất cứ lúc nào, sang một app khác hoặc đơn giản là một file nằm trên máy. Không bị giam.

Đó là định nghĩa. Phần khó là làm cho đúng.

Kiến trúc Mira, kể thẳng

Mira giữ dữ liệu của bạn trong một database SQLite nằm trên điện thoại bạn. SQLite là một engine database nhỏ, mã nguồn mở, đã chạy trong gần như mọi smartphone trên thế giới — iOS, Android, trình duyệt, máy bay, thiết bị y tế. Nó ổn định một cách buồn chán, đó là điều tốt với data quan trọng.

Mọi thứ bạn ghi — note, mood, reflection — được viết thẳng vào file SQLite đó. Không gửi đi đâu. Nếu bạn tắt mạng vĩnh viễn, app vẫn chạy đầy đủ tính năng cốt lõi.

Phần sync (đồng bộ giữa điện thoại và máy tính, hoặc backup lên cloud) là tuỳ chọn, có ở gói Premium. Khi bạn bật, dữ liệu được mã hoá đầu-cuối (end-to-end, viết tắt E2E) trên máy bạn trước, rồi mới rời thiết bị. Server của chúng tôi chỉ thấy một mớ byte ngẫu nhiên — không đọc được nội dung, kể cả khi muốn.

E2E encryption, giải thích bằng bưu phẩm

Bạn không cần biết toán để hiểu E2E. Hình dung thế này.

Bạn viết một bức thư, bỏ vào một hộp sắt nhỏ, khoá lại bằng một ổ khoá. Chìa của ổ đó chỉ có hai bản: một ở chỗ bạn, một ở chỗ người nhận. Bạn gửi hộp đó qua bưu điện. Nhân viên bưu điện cầm hộp, vận chuyển, giao đi — nhưng họ không có chìa, nên dù họ muốn mở ra đọc cũng không được. Họ chỉ biết “có một cái hộp đi từ A đến B”.

E2E là vậy. Mira là bưu điện. Hộp sắt là dữ liệu của bạn. Chìa khoá nằm trên thiết bị của bạn, không bao giờ rời máy. Server thấy hộp, không thấy nội dung. Nếu hacker tấn công server và lấy toàn bộ database, họ cũng chỉ có một đống hộp khoá — không có chìa để mở.

Mô hình này không phải Mira phát minh. Signal dùng để bảo mật tin nhắn từ 2014. ProtonMail dùng cho email. iCloud Keychain dùng cho mật khẩu. Đây là kỹ thuật đã được kiểm chứng nhiều năm — chúng tôi chỉ áp dụng nó cho nhật ký cảm xúc.

Honest trade-off — phần ít ai chịu nói

Local-first không free lunch. Có ba thứ bạn cần biết, không tô vẽ.

Một, làm app local-first khó hơn cho người viết code. Sync mà không có server đứng giữa làm “trọng tài” thì phải xử lý conflict (cùng một note bạn sửa trên hai máy lúc offline) — phần này về mặt kỹ thuật gọi là CRDT, viết nó đúng tốn thời gian. Chúng tôi accept cái khó đó, vì lý do dưới.

Hai, backup không tự động nếu bạn không bật sync. Nếu bạn dùng bản free, dữ liệu chỉ nằm trên một thiết bị. Mất điện thoại = mất dữ liệu. Mira sẽ nhắc bạn export định kỳ, hoặc bật sync (có Premium) để có bản backup mã hoá. Nhưng chúng tôi không tự ý làm thay bạn — vì làm thay tức là phải gửi dữ liệu đi đâu đó, mà bạn chưa cho phép.

Ba, multi-device cần sync. Nếu bạn dùng cả điện thoại và máy tính, không có sync thì hai bên không thấy nhau. Đây là lý do sync nằm ở Premium — không phải để khoá tính năng, mà vì sync là phần tốn server thật, và chúng tôi cần ai đó trả tiền cho phần đó. Bản free vẫn đầy đủ trên một máy.

Lời cam kết, không phải marketing line

Mira không bán dữ liệu. Không có tracking pixel, không có analytics SDK của bên thứ ba, không có quảng cáo. Đây là quyết định business — chúng tôi sống bằng tiền user trả cho Premium, không phải bằng tiền nhà quảng cáo trả để xem user.

Quyết định này có giá. Nó nghĩa là chúng tôi phải làm sản phẩm đủ tốt để bạn muốn trả tiền, không thể dùng dữ liệu của bạn để bù lỗ. Nó nghĩa là chúng tôi lớn chậm hơn. Chúng tôi ok với chuyện đó.

Nếu một ngày Mira đóng cửa — startup nào cũng có rủi ro đó — bạn vẫn có file SQLite trên máy. Chúng tôi cam kết sẽ public spec của định dạng đó để các công cụ khác đọc được. Dữ liệu của bạn không phụ thuộc vào việc chúng tôi còn sống hay không.


Bạn muốn đọc kỹ về architecture? Privacy page của Mira nằm ở mira.vn/privacy. Đặt câu hỏi, sẽ trả lời thẳng.



📱 Phiên bản TikTok / Short Video

1. Bảng cấu trúc video (60s, 7 scenes)

GiâyScene / Hình ảnhText hiển thịVoice đọc
0-3Màn hình điện thoại đầy app, một icon mờ dần rồi biến mất”App đóng cửa = mất dữ liệu”Hook: app server đóng, chuyện gì xảy ra?
3-12Hình minh hoạ data bay từ phone lên đám mây, dừng lại ở server xa lạ”Mỗi app gửi data lên cloud”Mô tả mô hình cloud-first phổ biến
12-22Ba icon rủi ro: leak, app shutdown, paywall đọc lại”Ba rủi ro thật”Liệt kê leak, đóng cửa, bị giam
22-32Phone tĩnh, một biểu tượng SQLite/file nằm gọn trong thiết bị”Local-first: data ở máy bạn”Định nghĩa local-first ngắn gọn
32-42Hộp sắt nhỏ có ổ khoá, chìa nằm cạnh phone, server thấy hộp đen”E2E: server không có chìa”Giải thích mã hoá đầu-cuối bằng hộp sắt
42-52Trade-off card: backup không tự động, sync ở Premium”Trade-off: bạn cần biết”Honest về limitation
52-60Logo Mira trên nền Ink, dòng “build local-first” và CTA follow”Mira build local-first”CTA follow để xem

2. Mô tả chi tiết từng scene

Scene 1 (0-3s) — Hook

  • Prompt ảnh (English): Close-up of a smartphone screen filled with app icons arranged in a grid, one icon in the center gently fading and dissolving into transparency, leaving an empty slot. Soft warm desk light from upper left, slight motion blur on the dissolving icon to suggest disappearance. No text on screen, no logos, no specific brand references. Palette: deep ink black background, muted warm cream highlights, single moss-green accent on the fading slot. Mood: quiet unease, not panic. Shot at 50mm, shallow depth of field.
  • Mô tả (tiếng Việt): Cận cảnh màn hình điện thoại với lưới icon, một icon ở giữa mờ dần và biến mất, để lại ô trống. Tone trầm, không hoảng loạn.
  • Text overlay (≤8 từ): “App đóng cửa = mất data”
  • Màu nền brand: Ink #1F1A14 dominant + Sand #EFE9DD highlights

Scene 2 (3-12s) — Mô tả cloud-first

  • Prompt ảnh (English): Isometric illustration of a single smartphone on the left, with a thin stream of small paper documents flowing upward and rightward into a stylized cloud shape, then continuing into a distant grey server rack at the far right. The flow has a one-way arrow feel. Background is muted warm beige, the server is rendered in cold neutral grey to contrast with the warm phone, suggesting “your stuff goes far away”. No people, no logos, no neon, no cyber tropes. Palette: sand cream base, ink-black phone, cold grey server, moss-green flow arrow.
  • Mô tả (tiếng Việt): Minh hoạ isometric: điện thoại bên trái, dòng tài liệu bay lên đám mây rồi tiếp vào server xám xa xa. Một chiều, ấm-lạnh tương phản.
  • Text overlay (≤8 từ): “Data chạy lên cloud của họ”
  • Màu nền brand: Sand #EFE9DD + Ink #1F1A14 + Moss #5A6B4E accent

Scene 3 (12-22s) — Ba rủi ro

  • Prompt ảnh (English): Three flat-style icon cards arranged horizontally on a warm sand background, each card a soft rounded rectangle in ink-black with a single line illustration inside. Card one: a broken padlock with a few paper sheets spilling out, representing data leak. Card two: a closed shop shutter with a small “closed” tag, representing app shutdown. Card three: a small paywall barrier in front of a notebook, representing locked-out access. Minimal, no text inside icons, no logos, no neon. Palette: sand cream cards background, ink-black line art, single warm clay accent on the broken lock.
  • Mô tả (tiếng Việt): Ba thẻ icon line-art: ổ khoá vỡ (leak), cửa kéo đóng (shutdown), barrier trước sổ tay (paywall đọc lại). Bố cục flat, sạch.
  • Text overlay (≤8 từ): “Leak. Shutdown. Bị giam.”
  • Màu nền brand: Sand #EFE9DD + Ink #1F1A14 + Warm Clay #C97D60 nhẹ

Scene 4 (22-32s) — Local-first định nghĩa

  • Prompt ảnh (English): A single smartphone resting flat on a warm wooden desk, screen facing up. On the screen, a small simple icon of a database file labeled faintly with “sqlite” in monospace, glowing very softly from within. No cloud above, no server visible, no network lines leaving the device. Soft natural window light from the left, a small notebook and pen beside the phone for context. Palette: warm wood brown, ink black, muted moss accent on the database icon. Mood: grounded, self-contained, quiet ownership.
  • Mô tả (tiếng Việt): Điện thoại nằm trên bàn gỗ, màn hình hiển thị icon database nhỏ ghi “sqlite”. Không có cloud, không có đường mạng đi ra. Ánh sáng tự nhiên.
  • Text overlay (≤8 từ): “Data ở trên máy bạn”
  • Màu nền brand: Sand #EFE9DD + Ink #1F1A14 + Moss #5A6B4E

Scene 5 (32-42s) — E2E giải thích bằng hộp sắt

  • Prompt ảnh (English): Three-object still life on a wooden surface, shot from a slight overhead angle. On the left: a small matte-black metal box with a tiny brass padlock clicked through its latch. In the middle: a single brass key resting next to the box, clearly the same shape. On the right, slightly out of focus in the background: a stylized server rack rendered in grey, with a duplicate of the locked black box on a shelf inside it, but no key in sight near the server. Soft window light. The story reads left-to-right: your key stays with you, only the locked box travels. No text, no logos.
  • Mô tả (tiếng Việt): Hộp sắt khoá ở trái, chìa nằm cạnh (ở chỗ bạn), server xám phía sau có một hộp khoá khác trên kệ nhưng không có chìa. Ẩn dụ E2E.
  • Text overlay (≤8 từ): “Server không có chìa”
  • Màu nền brand: Ink #1F1A14 + Sand #EFE9DD + Moss #5A6B4E

Scene 6 (42-52s) — Trade-off honest

  • Prompt ảnh (English): A simple two-column information card layout on a warm sand background. Left column header reads as a quiet line, right column shows a short bullet style list of three short items rendered as small dashes. The card has soft rounded corners, ink-black thin border, no decoration, no icons except a single small dash bullet style on each line. No people, no logos, no flashy graphics. Palette: sand background, ink-black text and borders, one moss-green accent dot beside the column header. Mood: calm, matter-of-fact, no marketing gloss.
  • Mô tả (tiếng Việt): Card hai cột thông tin sạch, không trang trí, bullet dấu gạch ngang. Tone matter-of-fact, không corporate.
  • Text overlay (≤8 từ): “Không free lunch”
  • Màu nền brand: Sand #EFE9DD + Ink #1F1A14 + Moss #5A6B4E dot

Scene 7 (52-60s) — CTA

  • Prompt ảnh (English): Minimalist end card with the wordmark style placeholder text “Mira” rendered in a warm serif feel, centered on a deep ink-black background. Below the wordmark, a single thin horizontal line in muted moss green, and beneath that a short tagline placeholder area. The composition is generous in negative space, no icons, no buttons, no graphics, no people. Palette: ink-black background dominant, sand cream wordmark, single moss-green underline. Mood: quiet confidence, end-frame stillness.
  • Mô tả (tiếng Việt): End-card tối giản: chữ “Mira” trên nền Ink, gạch ngang Moss mỏng phía dưới, nhiều không gian âm. Tĩnh, tự tin.
  • Text overlay (≤8 từ): “Build local-first. Follow.”
  • Màu nền brand: Ink #1F1A14 dominant + Sand #EFE9DD wordmark + Moss #5A6B4E

3. Script voice-over đầy đủ

[00:00] Mỗi app bạn dùng đều lưu dữ liệu trên server của họ. [pause] Chuyện gì xảy ra nếu họ đóng cửa?

[00:03] Từ khoảng 2012 đến giờ, gần như mọi app mặc định gửi data của bạn lên cloud trước. [pause] Tiện cho họ. Còn bạn — không kiểm soát được nữa.

[00:12] Ba thứ thực sự xảy ra. [nhấn] Một, leak — data tập trung một chỗ là mật ngọt cho hacker. Hai, app đóng cửa, dữ liệu đi theo. Ba, hết Premium, bị khoá luôn cả phần đọc lại.

[00:22] Local-first ngược lại. [pause] Data primary nằm trên máy bạn. Cloud — nếu có — chỉ là bản phụ. Mất mạng, app vẫn chạy. Server sập, data bạn vẫn còn.

[00:32] Mã hoá đầu-cuối, hình dung như bưu phẩm. [pause] Bạn bỏ thư vào hộp sắt, khoá lại. Chìa chỉ ở chỗ bạn. Bưu điện chỉ chuyển hộp — không mở được, kể cả muốn.

[00:42] Trade-off thật. [nhấn] Bản free, backup không tự động. Multi-device cần sync, có ở Premium. Mira nói thẳng những điều đó.

[00:52] Mira được build local-first. [pause] Follow để xem.

4. Caption TikTok

Mỗi app gửi data lên server của họ. Họ đóng cửa, data đi theo. Local-first ngược lại — data nằm trên máy bạn.

#mira #localfirst #privacy #datasecurity #appviet

5. JSON placeholder video

{
  "video_id": "tk-bai08",
  "title": "Local-first và tại sao dữ liệu của bạn nên ở trên máy bạn",
  "duration_seconds": 60,
  "status": "pending_image_approval",
  "brand_palette": ["#EFE9DD", "#1F1A14", "#5A6B4E"],
  "persona_target": "Phong + tech-aware",
  "scenes": [
    {
      "id": "scene-1",
      "range": "0-3s",
      "role": "hook",
      "text_overlay": "App đóng cửa = mất data",
      "image_prompt_ref": "scene-1-prompt",
      "dominant_color": "#1F1A14"
    },
    {
      "id": "scene-2",
      "range": "3-12s",
      "role": "context",
      "text_overlay": "Data chạy lên cloud của họ",
      "image_prompt_ref": "scene-2-prompt",
      "dominant_color": "#EFE9DD"
    },
    {
      "id": "scene-3",
      "range": "12-22s",
      "role": "problem",
      "text_overlay": "Leak. Shutdown. Bị giam.",
      "image_prompt_ref": "scene-3-prompt",
      "dominant_color": "#EFE9DD"
    },
    {
      "id": "scene-4",
      "range": "22-32s",
      "role": "definition",
      "text_overlay": "Data ở trên máy bạn",
      "image_prompt_ref": "scene-4-prompt",
      "dominant_color": "#EFE9DD"
    },
    {
      "id": "scene-5",
      "range": "32-42s",
      "role": "metaphor",
      "text_overlay": "Server không có chìa",
      "image_prompt_ref": "scene-5-prompt",
      "dominant_color": "#1F1A14"
    },
    {
      "id": "scene-6",
      "range": "42-52s",
      "role": "tradeoff",
      "text_overlay": "Không free lunch",
      "image_prompt_ref": "scene-6-prompt",
      "dominant_color": "#EFE9DD"
    },
    {
      "id": "scene-7",
      "range": "52-60s",
      "role": "cta",
      "text_overlay": "Build local-first. Follow.",
      "image_prompt_ref": "scene-7-prompt",
      "dominant_color": "#1F1A14"
    }
  ]
}

Lưu ý biên tập: dưới đây là phiên bản TikTok thay thế (v2), được giữ song song với v1 ở trên để team chọn hoặc A/B test.


📱 Phiên bản TikTok / Short Video

Format: 60 giây | Vertical 9:16 | Voice + Text overlay + Hình ảnh tĩnh

Cấu trúc video (theo giây)

GiâyHình ảnh (Scene)Text hiển thịVoice đọc
0–8Cận cảnh tay người cầm điện thoại, màn hình hiện grid 80 app nhỏ xíu, ngón tay vuốt chậm80 app trong máy bạnTrong điện thoại bạn có khoảng 80 app. Bao nhiêu cái đang gửi dữ liệu của bạn đi ngay lúc này?
8–16Cảnh top-down một chiếc bàn gỗ, điện thoại nằm giữa, xung quanh có nhiều mũi tên giấy nhỏ chỉ ra ngoài khung hìnhGần như tất cảCâu trả lời thật lòng: gần như tất cả. App ghi chú, app sức khoẻ, app nhật ký — đều gửi lên cloud của họ.
16–26Cảnh chiếc két nhỏ matte đen trên bàn gỗ, nắp hơi mở, ánh sáng cửa sổ tráiDữ liệu của bạn nên ở đâu?Có một câu hỏi ít ai dừng lại để hỏi. Cái nhật ký cảm xúc của bạn — tại sao nó phải nằm trên server của một công ty xa lạ?
26–36Cảnh phong bì giấy có ổ khoá đồng nhỏ ở góc, đặt cạnh két, ánh sáng ấmLocal-firstĐây là local-first. Dữ liệu nằm trên máy bạn. Không phải bản sao — bản thật. Mất mạng vẫn dùng đầy đủ.
36–46Cảnh điện thoại face-up trên bàn, màn hình hiện một dòng SQLite mờ kiểu monospaceMột file. Trên máy bạn.Mira lưu mọi thứ bạn ghi vào một file SQLite trên điện thoại bạn. Không gửi đi đâu. Bạn tắt mạng vĩnh viễn, app vẫn chạy.
46–54Cảnh hai bàn tay đặt chiếc hộp khoá lên bàn, không thấy mặt ngườiServer không có chìaNếu bạn bật sync, dữ liệu được mã hoá đầu-cuối trước khi rời máy. Server của Mira thấy hộp khoá, không thấy nội dung.
54–60Cảnh tĩnh logo Mira nhỏ trên nền sand cream, dưới là dòng URLmira.vnMira. Dữ liệu của bạn — ở trên máy bạn. Tải miễn phí ở mira.vn.

🖼️ Mô tả hình ảnh từng scene

Scene 1 (0–8s):

  • Prompt ảnh (Midjourney/DALL-E): A close-up overhead shot of a Vietnamese person’s hand holding a smartphone in portrait orientation, the screen showing a dense grid of about 80 small app icons in muted tones, a single finger slowly swiping across the screen, soft natural morning light from a window on the left, warm wooden desk surface beneath, shallow depth of field at 50mm, palette dominated by Mira Sand cream #EFE9DD background and deep Ink #1F1A14 phone frame, quiet domestic mood, no logos visible on icons, slow-life aesthetic, not a tech-product shot, 9:16 vertical composition.
  • Mô tả tiếng Việt: Cận cảnh từ trên xuống bàn tay người Việt cầm điện thoại, màn hình đầy app nhỏ tông xám, ngón tay vuốt chậm, ánh sáng cửa sổ ấm, mặt bàn gỗ ấm.
  • Text overlay: “80 app trong máy bạn” — font sans-serif bold, màu Ink #1F1A14, đặt trên đỉnh khung hình.
  • Màu nền: Mira Sand #EFE9DD chủ đạo, Ink #1F1A14 phụ.

Scene 2 (8–16s):

  • Prompt ảnh (Midjourney/DALL-E): Overhead top-down still life on a warm wooden table, a single smartphone lying face-up in the center showing a blurred home screen, around it several small hand-cut paper arrows pointing outward away from the phone toward the edges of the frame, soft natural side light, palette of Mira Sand cream #EFE9DD and warm Clay #C97D60 accents on the paper arrows, quiet documentary photography mood, 35mm shallow depth of field, no people visible, vertical 9:16 composition, slow-life editorial style, not stock-photo glossy.
  • Mô tả tiếng Việt: Top-down chiếc điện thoại nằm giữa bàn gỗ, các mũi tên giấy nhỏ thủ công chỉ ra ngoài bốn phía như ẩn dụ dữ liệu rò ra.
  • Text overlay: “Gần như tất cả” — font bold, màu Warm Clay #C97D60, giữa khung dưới.
  • Màu nền: Sand #EFE9DD với accent Warm Clay #C97D60.

Scene 3 (16–26s):

  • Prompt ảnh (Midjourney/DALL-E): A small matte black personal safe sitting on a warm wooden desk, lid slightly ajar revealing nothing inside, soft natural window light from the left at 9am quality, shadow falling gently to the right, deep shallow depth of field at 35mm, palette of deep Ink #1F1A14 safe against Mira Sand cream #EFE9DD desk, quiet trustworthy mood, no people, no logos, no cyber or neon cliches, editorial still-life photography style, vertical 9:16 composition.
  • Mô tả tiếng Việt: Cận cảnh chiếc két nhỏ matte đen trên bàn gỗ, nắp hơi mở, ánh sáng cửa sổ trái dịu, không cảm giác công nghệ cao.
  • Text overlay: “Dữ liệu của bạn nên ở đâu?” — font bold, màu Ink #1F1A14, đặt trên đỉnh.
  • Màu nền: Mira Sand #EFE9DD và Ink #1F1A14.

Scene 4 (26–36s):

  • Prompt ảnh (Midjourney/DALL-E): A sealed paper envelope on a warm wooden surface, a tiny brass padlock threaded through one corner of the envelope flap suggesting end-to-end encryption, the black personal safe softly out of focus behind it, warm natural afternoon light from the left, palette of muted Moss green #5A6B4E padlock against Sand #EFE9DD envelope and Ink #1F1A14 safe, quiet grounded mood, 35mm shallow depth of field, no people, no logos, editorial still-life, vertical 9:16 composition.
  • Mô tả tiếng Việt: Phong bì giấy đóng kín với ổ khoá đồng nhỏ xíu ở góc, két đen mờ phía sau, ánh sáng chiều ấm.
  • Text overlay: “Local-first” — font bold lớn, màu Moss #5A6B4E, đặt giữa khung.
  • Màu nền: Sand #EFE9DD với accent Moss #5A6B4E.

Scene 5 (36–46s):

  • Prompt ảnh (Midjourney/DALL-E): A smartphone lying face-up flat on a warm wooden desk, the screen displaying a single faint line of SQLite query in monospace font on a clean cream background, slight reflection of natural ceiling light on the screen, palette of Mira Sand #EFE9DD screen with Ink #1F1A14 text, surrounding desk in warm Clay #C97D60 wood tones, quiet domestic morning light, 35mm shallow depth of field, no people, no app branding, editorial documentary style, vertical 9:16 composition.
  • Mô tả tiếng Việt: Điện thoại nằm ngửa trên bàn gỗ ấm, màn hình hiện một dòng SQLite mờ kiểu monospace, ánh sáng tự nhiên dịu.
  • Text overlay: “Một file. Trên máy bạn.” — font bold, màu Ink #1F1A14, dưới đáy khung.
  • Màu nền: Sand #EFE9DD và Ink #1F1A14.

Scene 6 (46–54s):

  • Prompt ảnh (Midjourney/DALL-E): Two Vietnamese hands gently placing a small locked metal box onto a warm wooden table, hands only visible from the wrists down, soft natural side light at golden hour quality, palette of Ink #1F1A14 metal box against Mira Sand #EFE9DD table surface with Calm Sky #A8B8C4 fabric sleeve edge, quiet trusting mood, 35mm shallow depth of field, no faces visible, no logos, editorial documentary photography style, vertical 9:16 composition.
  • Mô tả tiếng Việt: Hai bàn tay người Việt nhẹ nhàng đặt hộp khoá lên bàn gỗ, không thấy mặt, ánh sáng vàng dịu.
  • Text overlay: “Server không có chìa” — font bold, màu Ink #1F1A14, đỉnh khung.
  • Màu nền: Sand #EFE9DD và Calm Sky #A8B8C4.

Scene 7 (54–60s):

  • Prompt ảnh (Midjourney/DALL-E): A minimal still composition on a flat Mira Sand cream #EFE9DD background, a small wordmark “Mira” centered in a serif typeface in Ink #1F1A14, below it a single thin horizontal line in Moss green #5A6B4E, and below that the URL “mira.vn” in smaller monospace text, soft natural studio light from above, no shadows, calm minimalist editorial poster style, no people, vertical 9:16 composition.
  • Mô tả tiếng Việt: Khung tĩnh tối giản, nền sand, logo Mira ở giữa, dòng kẻ moss mảnh, URL mira.vn phía dưới.
  • Text overlay: “mira.vn” — font monospace, màu Ink #1F1A14, giữa dưới.
  • Màu nền: Sand #EFE9DD chủ đạo, Moss #5A6B4E và Ink #1F1A14 phụ.

🎙️ Script Voice-over đầy đủ

Giọng đọc: nữ miền Nam, tốc độ chậm vừa, tone trầm, thật, không kịch tính

Trong điện thoại bạn có khoảng 80 app. [pause 1s] Bao nhiêu cái đang gửi dữ liệu của bạn đi ngay lúc này? [pause 1s] Câu trả lời thật lòng: gần như tất cả. App ghi chú, app sức khoẻ, app nhật ký — đều gửi lên cloud của họ. [pause 1s] Có một câu hỏi ít ai dừng lại để hỏi. Cái nhật ký cảm xúc của bạn — tại sao nó phải nằm trên server của một công ty xa lạ? [pause 1s] Đây là [nhấn] local-first. Dữ liệu nằm trên máy bạn. Không phải bản sao — bản thật. Mất mạng vẫn dùng đầy đủ. [pause 1s] Mira lưu mọi thứ bạn ghi vào một file SQLite trên điện thoại bạn. Không gửi đi đâu. Bạn tắt mạng vĩnh viễn, app vẫn chạy. [pause 1s] Nếu bạn bật sync, dữ liệu được mã hoá đầu-cuối trước khi rời máy. Server của Mira thấy hộp khoá, [nhấn] không thấy nội dung. [pause 1s] Mira. Dữ liệu của bạn — ở trên máy bạn. Tải miễn phí ở mira.vn.


📝 Caption TikTok

80 app trong máy bạn đang gửi dữ liệu đi đâu? Mira chọn cách khác: dữ liệu ở trên máy bạn, không phải server. #localfirst #quyenrieng tu #mira #appviet #privacy


🎬 Video (sẽ gen sau)

Phần này để trống — sẽ được generate bằng AI video tool (Runway / Kling / Pika) sau khi hình ảnh được duyệt.

{
  "tool": "TBD",
  "style": "cinematic_mobile",
  "duration": 60,
  "scenes": 7,
  "status": "pending_image_approval"
}