v6.8.15: the Android app is out for testing
CodeQL Analysis / Analyze CodeQL (push) Canceled after 0s
Deploy Application / deploy (push) Canceled after 0s
Mirror to Codeberg / mirror (push) Canceled after 0s
Mirror to PrivacyGuides / mirror (push) Canceled after 0s

- Android APK download, served from securebit.chat (/downloads/, never
  committed): a "Download Android APK" badge next to the Snap Store one, drawn
  for both themes, and an Android entry in the download menu (recommended on
  Android devices). nginx serves .apk as an attachment; the service worker
  leaves /downloads/ alone. The APK version is one constant in three places,
  checked by tests/desktop-download-links.test.mjs.
- Roadmap versions follow the real releases: Group Communications v6.0
  shipped, Mobile Edition v6.8 is current, Quantum-Resistant v7.0 is in
  development (2027), then v8.0 and v9.0.
- "Download desktop app" is now "Download the app"; the "You're on Web" pill
  in the download menu is gone.
This commit is contained in:
lockbitchat
2026-09-28 01:23:50 -04:00
parent 02b007af3e
commit bf5d43b2f1
59 changed files with 663 additions and 529 deletions
+22 -22
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ur/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790572497433">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<script src="/src/scripts/theme-boot.js?v=1790572497433"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790572497433"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790572497433">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790572497433">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/config/ice-servers.js?v=1790572497433"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<link rel="stylesheet" href="/assets/app.css?v=1790572497433">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790572497433">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790572497433"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<script defer src="/src/scripts/fa-check.js?v=1790572497433"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/ur.js?v=1790548306121"></script>
<script type="module" src="/src/i18n/dict/ur.js?v=1790572497433"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<script defer src="/src/utils/updateManager.js?v=1790572497433"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790572497433"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -439,17 +439,17 @@
</li>
<li>
<h3>گروہی رابطہ</h3>
<span class="sb-pre-when">ابھی</span>
<span class="sb-pre-when">خزاں 2026</span>
<p>نجیت برقرار رکھتے ہوئے گروہی گفتگو</p>
</li>
<li>
<h3>موبائل ایڈیشن</h3>
<span class="sb-pre-when">دوسری سہ ماہی 2027</span>
<span class="sb-pre-when">ابھی</span>
<p>‏iOS اور اینڈرائیڈ کے لیے مقامی ایپلی کیشنز</p>
</li>
<li>
<h3>کوانٹم مزاحم ایڈیشن</h3>
<span class="sb-pre-when">چوتھی سہ ماہی 2027</span>
<span class="sb-pre-when">2027</span>
<p>کوانٹم کمپیوٹرز سے تحفظ</p>
</li>
<li>
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script type="module" src="/dist/app-boot.js?v=1790572497433"></script>
<script type="module" src="/dist/app.js?v=1790572497433"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790572497433"></script>
<script src="/src/pwa/install-prompt.js?v=1790572497433" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790572497433" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790572497433"></script>
</body>
</html>