Cài opolyx lên điện thoại — và đăng nhập không cần mật khẩu
opolyx giờ là một ứng dụng cài đặt được thực thụ, với bốn cách để vào: liên kết ma thuật, mã gửi qua email, Google hoặc Apple. Mã là cách hoạt động ở mọi nơi.

Nói đơn giản
Bạn có thể thêm opolyx vào màn hình chính và mở nó như mọi ứng dụng khác: biểu tượng riêng, không thanh trình duyệt, vào thẳng sảnh chờ. Điều này đã hoạt động trên Android và iOS ngay từ menu trình duyệt, và đây cũng chính là bản dựng chúng tôi đang đóng gói cho các kho ứng dụng.
- mở toàn màn hình vào thẳng sảnh chờ chứ không phải trang giới thiệu;
- giữ biểu tượng và màn hình khởi động riêng thay vì chỉ là lối tắt trình duyệt;
- hiển thị một trang opolyx đàng hoàng khi bạn ngoại tuyến, thay vì lỗi của trình duyệt;
- không bao giờ lưu đệm bất cứ thứ gì của ván đang diễn ra, nên ứng dụng đã cài luôn mới như trang web.
Hiện có bốn lối đăng nhập, và bạn dùng lối nào hợp với thiết bị của mình cũng được:
| Cách | Hoạt động thế nào |
|---|---|
| Liên kết ma thuật | một liên kết trong email — chạm một lần, không cần mật khẩu |
| Mã qua email | mã 8 ký tự bạn gõ trên trang đăng nhập |
| khung chọn tài khoản quen thuộc | |
| Apple | kể cả Hide My Email, phía sau đó chúng tôi không bao giờ nhìn thấy gì |
Mã gửi qua email là lối đi hoạt động ở tuyệt đối mọi nơi — kể cả bên trong lớp vỏ ứng dụng, nơi một liên kết sẽ mở ở trình duyệt khác và không thể trả phiên đăng nhập về.
Cho người thích chi tiết kỹ thuật
Service worker được thiết kế hẹp một cách có chủ ý. Nó là danh sách cho phép chứ không phải bắt tất: các lượt điều hướng ưu tiên mạng trước với một trang ngoại tuyến làm phương án dự phòng, tài nguyên tĩnh có mã băm dùng stale-while-revalidate, còn tất cả phần còn lại — cơ sở dữ liệu, máy chủ trò chơi, kênh thời gian thực, xác thực, dữ liệu kết xuất phía máy chủ — đều được bỏ qua hoàn toàn, nên nó không thể phục vụ một bàn cờ cũ hay làm hỏng một ván đang diễn ra.
// public/sw.js — allow-list, not catch-all
self.addEventListener('fetch', (event) => {
const url = new URL(event.request.url);
if (url.origin !== self.location.origin) return; // Supabase, daemon: untouched
if (BYPASS.some((p) => url.pathname.startsWith(p))) return; // /auth, /api, RSC
if (event.request.mode === 'navigate') return event.respondWith(networkFirst(event));
if (HASHED.test(url.pathname)) return event.respondWith(staleWhileRevalidate(event));
});Phần thú vị nằm ở bản dựng iOS được đóng gói, nơi không một cách đăng nhập nào hoàn tất trong khi mọi trình duyệt đều chạy tốt. Nguyên nhân là một thiết lập WebKit mà công cụ đóng gói tự ghi giúp bạn: khi bật cơ chế miền gắn với ứng dụng, WebKit lặng lẽ hủy mọi lượt điều hướng cấp cao nhất tới một máy chủ không nằm trong danh sách — và bước nhảy đầu tiên của luồng OAuth đúng là một lượt điều hướng như vậy. Ngoài ra, Google từ chối webview nhúng vì lý do chính sách, điều mà không cấu hình nào sửa được.
Liên kết ma thuật cũng chẳng bao giờ hoàn tất được ở đó: nó mở trong trình duyệt hệ thống, nơi webview của ứng dụng không nhìn thấy kho cookie. Chính vì thế, mã gõ tay là lối email cùng nguồn duy nhất — nó kết thúc ngay trong webview đã yêu cầu.
Với Google, cách được chấp thuận là chạy luồng trong trình duyệt hệ thống rồi trả phiên đăng nhập về. Cầu nối dựng URL ủy quyền một cách có chủ ý mà không dùng PKCE, để luồng trả token trong phần fragment của callback mà lớp vỏ đọc được — còn mã ủy quyền thì chỉ trình duyệt đang giữ verifier mới đổi được, và đó lại là trình duyệt không phù hợp.
