Chúng tôi đã hoàn tất kiểm toán GDPR. Đây là những gì chúng tôi thực sự đã hoàn tất.
Vài tuần trước, chúng tôi đã viết rằng cụm từ "tuân thủ GDPR" trên trang chủ của một công cụ video có ý nghĩa ít hơn bạn nghĩ — rằng GDPR là một tập hợp các nghĩa vụ dành cho bạn, bên kiểm soát dữ liệu, mà một nhà cung cấp sẽ giúp bạn đáp ứng hoặc lặng lẽ để lại cho bạn tự xử. Cách trung thực để chứng minh điều đó là tự thực hiện công việc ở phía chúng tôi và hiển thị nó, từng dòng một.
Và chúng tôi đã làm điều đó. Chúng tôi đã tiến hành một cuộc kiểm toán toàn diện mã nguồn InterMIND dựa trên các nghĩa vụ thuộc về chúng tôi với tư cách là bên xử lý dữ liệu, khắc phục mọi khoảng trống có liên quan đến mã nguồn và xác minh từng mục đối với sản phẩm đang hoạt động. Bài đăng này là báo cáo hoàn tất — không phải một huy hiệu, mà là một danh sách kiểm tra với các câu trả lời của chúng tôi.
Chúng tôi cố ý không tuyên bố "chứng nhận GDPR 100%." GDPR không phải là một chứng chỉ bạn có thể vượt qua — và chúng tôi sẽ không vẫy một huy hiệu ISO mà chúng tôi chưa được cấp. Những gì chúng tôi có thể nói: các nghĩa vụ về kiến trúc và quy trình mà một DPO phải xem xét hiện đã có những câu trả lời cụ thể, có thể kiểm chứng, từng mục đều được kiểm tra đối chiếu với mã nguồn đang hoạt động.
Những gì chúng tôi đã hoàn tất
Quyền được xóa dữ liệu (Điều 17) — quá trình xóa nối tiếp thực sự chạy
Việc xóa tài khoản của bạn không chỉ là ngừng kích hoạt nó. POST /api/user/delete-account chạy một quá trình xóa nối tiếp (cascade) thực sự: nó xóa sạch các cuộc họp của bạn → người tham gia, tin nhắn, hội nghị, bản chép lời; nó dọn dẹp các khối lưu trữ (storage blobs) của bạn khỏi Tigris trước khi quá trình xóa nối tiếp cơ sở dữ liệu diễn ra để không có gì bị bỏ sót — tệp đính kèm trò chuyện và tệp ghi hình video, ở cả hai cột; và nó hủy các đăng ký Stripe cũng như xóa khách hàng Stripe. Tính năng xóa theo yêu cầu cũng có sẵn — xóa một kênh hoặc tin nhắn khỏi UI và nó sẽ biến mất. Các tài khoản ẩn danh (khách) có trình cuối xóa riêng của chúng cùng với quy trình dọn dẹp nền cứ sau 6 giờ, dưới sự giám sát của cron. Quá trình kiểm toán đã phát hiện một khoảng trống ở đây — các khối ghi hình mà quá trình xóa nối tiếp cơ sở dữ liệu đã xóa nhưng kho lưu trữ vẫn giữ lại — và chúng tôi đã khắc phục: quá trình xóa hiện không để sót lại bất cứ thứ nào trong kho lưu trữ đối tượng (object storage).
Lưu giữ dữ liệu (Điều 5(1)(e)) — một tiêu chí được ghi nhận
Điều 5(1)(e) không yêu cầu thời gian sống (time-to-live) tự động. Nó yêu cầu một tiêu chí lưu trữ được xác định. Tiêu chí của chúng tôi hiện được ghi vào Chính sách quyền riêng tư: dữ liệu được lưu giữ cho đến khi bạn hoặc chủ sở hữu nhóm của bạn xóa nó, và việc xóa tài khoản sẽ xóa mọi thứ. Đó là mô hình mà các công cụ hợp tác như Slack và Notion đang áp dụng — sự tồn tại của dữ liệu là hành vi được mong đợi, và bạn luôn giữ quyền kiểm soát nó. Tiêu chí được nêu rõ ràng, không ngụ ý.
Đồng ý phân tích (Điều 6/7) — mặc định không tham gia (opt-out)
Một biểu ngữ đồng ý của Usercentrics (hiển thị đối với khách truy cập từ EU) sẽ kiểm soát việc phân tích, và PostHog được cấu hình với opt_out_capturing_by_default: true — không có gì bị thu thập cho đến khi có sự đồng ý, chứ không phải ngược lại.
Tính di động dữ liệu (Điều 20) — xuất dữ liệu thực tế
GET /api/user/export tạo ra một tệp ZIP chứa các cuộc họp, tin nhắn, bản ghi và bản dịch của bạn, với khoảng thời gian tải xuống 7 ngày và tự động dọn dẹp. Quyền truy cập, xóa và di động dữ liệu là các công cụ thực sự hoạt động, chứ không phải là những lời hứa trên giấy tờ.
Nội dung cuộc họp được gửi đến một cổng AI, tại EU — do tổ chức lựa chọn
Dòng chảy lớn nhất duy nhất của nội dung cuộc họp — bản dịch giọng nói và trò chuyện trực tiếp — chạy trên chính công cụ của chúng tôi tại Pháp, không bao giờ sử dụng LLM của bên thứ ba. Các bước AI có sử dụng mô hình mục đích chung (tóm tắt, tóm tắt tài liệu, các hành động tạo văn bản của trình soạn thảo ghi chú, Ask AI) chạy trên cổng AI mà tổ chức chọn — Azure OpenAI trong EU Data Zone theo mặc định, Vertex AI EU hoặc Amazon Bedrock Frankfurt theo lựa chọn, mỗi nền tảng nằm trong chính tenant của chúng tôi với mức dữ liệu lưu trữ bằng không và không đào tạo trên nội dung của khách hàng, hoặc endpoint riêng của tổ chức; một trình phân giải (resolver) trong mã nguồn sẽ chọn cổng AI cho mỗi vị trí gọi, do đó không có đường dẫn thứ hai. Chúng tôi cũng đã loại bỏ tên người tham gia và văn bản phát biểu khỏi các nhật ký trình duyệt hội nghị mà tính năng ghi phiên của PostHog có thể chụp lại. Bản đồ chi tiết từng nhà cung cấp nằm trong Nơi diễn ra thực sự của một cuộc họp InterMIND.
Tính minh bạch — nhà xử lý phụ và hồ sơ xử lý, được công khai
Danh sách nhà xử lý phụ đã được công khai, kèm theo việc mỗi nhà cung cấp làm gì và họ đặt trụ sở ở đâu — thay vì "cung cấp khi có yêu cầu." Đằng sau nó là Bản ghi Các hoạt động Xử lý (ROPA) được xây dựng từ lược đồ trực tiếp: 11 hoạt động xử lý, các biện pháp bảo mật cho từng hoạt động và các đường dẫn xóa / di chuyển dữ liệu. Chính sách quyền riêng tư và Điều khoản của chúng tôi hiện hoạt động dưới thực thể pháp lý riêng của chúng tôi, với chuỗi xử lý thực tế được mô tả chi tiết.
Thời gian chạy tại EU — được ghim, không phải lời hứa
Mọi điểm chạm thời gian chạy (runtime hop) mà một cuộc họp thực hiện đều nằm trong EU: ứng dụng và API trên Vercel Frankfurt, máy chủ cuộc họp trên Fly Paris, dữ liệu ứng dụng trong Neon Postgres (AWS Frankfurt), lỗi trên Sentry EU, phân tích trên PostHog EU, email qua Resend Ireland. Lưu trữ đối tượng trên Tigris hiện đã được ghim vào các khu vực EU (Frankfurt + Amsterdam) — mọi thao tác ghi mới đều nằm trong EU bất kể người dùng đang ở đâu. Toàn bộ kiến trúc có trên trang bảo mật của chúng tôi.