diff --git a/.htaccess b/.htaccess
index 724604c..da3148f 100644
--- a/.htaccess
+++ b/.htaccess
@@ -197,59 +197,13 @@
# (see CLOUDFLARE_SETUP.md documentation)
# ============================================
-# SPA FALLBACK
+# NOT-FOUND HANDLING
# ============================================
-# If file not found, redirect to index.html (for SPA routing)
-
- # Locale shells first: a deep link under /de/ must fall back to the German page,
- # not the English one. Rewritten by scripts/build-i18n.js from locales/site.json.
- # BEGIN generated locale shells
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^de(/.*)?$ /de/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^fr(/.*)?$ /fr/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^es(/.*)?$ /es/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^uk(/.*)?$ /uk/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^ru(/.*)?$ /ru/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^zh(/.*)?$ /zh/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^ko(/.*)?$ /ko/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^hi(/.*)?$ /hi/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^ar(/.*)?$ /ar/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^he(/.*)?$ /he/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^fa(/.*)?$ /fa/index.html [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^ur(/.*)?$ /ur/index.html [L]
- # END generated locale shells
-
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_URI} !^/meta\.json$
- RewriteCond %{REQUEST_URI} !^/sw\.js$
- RewriteCond %{REQUEST_URI} !^/manifest\.json$
- RewriteRule ^(.*)$ /index.html [L]
-
+# There is no client-side routing, so an address that is not a file and not a
+# directory is a mistake rather than a route. Rewriting those to index.html answered
+# every typo with 200 OK and turned an infinite URL space into indexable pages.
+ErrorDocument 404 /404.html
# ============================================
# LOGGING (optional)
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..e0c46ea
--- /dev/null
+++ b/404.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ Page not found - SecureBit.chat
+
+
+
+
+
404
+
There is no page at this address.
+
The link may be mistyped, or it pointed at something that has since moved. Nothing was lost on our side — the app keeps no server-side state to lose.
+ Open SecureBit.chat
+
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 899a737..e76e1ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,35 @@
# Changelog
+## v6.7.3 — Faster loading, and pages search engines can actually read
+
+Loading got a lot lighter. The bundles used to carry all thirteen translations at once,
+and a page fetched them a third time as raw source; now each page loads only its own
+language. On top of that the JavaScript is minified, the eight stylesheets are served as
+one file, the QR scanner is fetched only once the app is up rather than on every visit,
+and the fonts and icons ship at the size they are actually used at — Inter was shipping
+the same file five times over, and Font Awesome was sending 2468 icons for the 82 this
+app draws.
+
+The page went from 1.85 MB across 43 requests to under 700 KB across 33. On a mobile
+connection it now starts drawing in 1.6 s instead of 6.3 s and is usable in 4.5 s
+instead of 11 s.
+
+Pages also arrive with their text already in the HTML. Everything used to be drawn by
+JavaScript into an empty div, so a search engine saw correct metadata wrapped around
+nothing — which is why twelve of the thirteen language pages had never been shown to
+anyone. Each page now carries its own headline, features and roadmap in the markup,
+visible to crawlers and to anyone without JavaScript, and replaced by the app the moment
+it loads. The documentation is published as real pages under `/docs/` with a new FAQ,
+and an address that does not exist returns a proper 404 instead of the app.
+
+One fix worth calling out: the localized pages were being served with a year-long cache
+header meant for static assets. Anyone who opened `/de/` or `/ru/` was pinned to that
+build and could not receive an update. The header is corrected, and the service worker
+now refreshes what it cached, so affected browsers recover on their next visit.
+
+Three unused components were removed along the way, and the placeholder testimonials
+that were never wired into the site are gone from the repository.
+
## v6.7.2 — Desktop 1.0.1
Download links point at desktop 1.0.1, which is the first build that works on
diff --git a/README.md b/README.md
index 1f3d262..cdbdcab 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
No accounts. No servers storing your messages. No installation required.
[](LICENSE)
-[](CHANGELOG.md)
+[](CHANGELOG.md)
[](https://snapcraft.io/securebit-chat)
[](#install-as-an-app)
[](#security-model)
diff --git a/ar/index.html b/ar/index.html
index 30500b5..5471e04 100644
--- a/ar/index.html
+++ b/ar/index.html
@@ -30,7 +30,7 @@
-
+
@@ -96,7 +96,7 @@
-
+
@@ -105,7 +105,7 @@
-
+
@@ -121,8 +121,7 @@
SecureBit.chat - مراسلة خاصة ومشفّرة
-
-
+
@@ -179,13 +178,27 @@
{
"@context": "https://schema.org",
"@graph": [
+ {
+ "@type": "Organization",
+ "@id": "https://securebit.chat/#organization",
+ "name": "SecureBit.chat",
+ "url": "https://securebit.chat/",
+ "logo": "https://securebit.chat/logo/icon-512x512.png",
+ "sameAs": [
+ "https://github.com/SecureBitChat/securebit-chat",
+ "https://snapcraft.io/securebit-chat"
+ ]
+ },
{
"@type": "WebSite",
"@id": "https://securebit.chat/#website",
"name": "SecureBit.chat",
"url": "https://securebit.chat/",
"description": "دردشة ندٌّ لندّ مشفّرة من الطرف إلى الطرف، تعمل بالكامل داخل متصفحك.",
- "inLanguage": "ar"
+ "inLanguage": "ar",
+ "publisher": {
+ "@id": "https://securebit.chat/#organization"
+ }
},
{
"@type": "WebApplication",
@@ -222,55 +235,235 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
+
+
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
SecureBit.chat
+
خطٌّ مباشر لا يقرأه إلّا أنتما.
+
تُولَّد المفاتيح على جهازك وتُتبادَل ندّاً لندّ. بلا حسابات وبلا خوادم تحفظ رسائلك.
+
+
+
ما الذي يميّزنا
+
لماذا SecureBit فريد
+
+
+
نواة تشفير متعدّدة الطبقات
+
تبادل مفاتيح ECDH P-384، وحمولات AES-256-GCM، وتواقيع ECDSA، وتحقّق ASN.1 كامل - مجموعة في خطّ واحد مُحصَّن.
+
ECDH P-384
AES-256-GCM
ECDSA
ASN.1
+
+
+
ندٌّ لندّ خالص عبر WebRTC
+
تنتقل الرسائل مباشرةً بين الأجهزة عبر WebRTC. لا مُرحِّل يحتفظ ببياناتك - الخادم يساعد الطرفين على إيجاد بعضهما فقط.
+
DTLS 1.3
بلا مُرحِّل
+
+
+
سرّية تامّة إلى الأمام
+
تتبدّل مفاتيح الجلسة باستمرار وتُتلَف بعد الاستعمال، فلا يفتح مفتاح واحد مسروق أيّ محادثة ماضية.
+
مفاتيح عابرة
تبديل تلقائي
+
+
+
تمويه حركة البيانات
+
تُحشى أحجام الحزم وتوقيتاتها وتُعشوَأ، فتختفي أنماط البيانات الوصفية عن أعين من يراقب الخطّ.
+
حشو الحزم
تشويش التوقيت
+
+
+
صفر جمعٍ للبيانات
+
لا حسابات ولا سجلّات ولا تخزين للرسائل. لا شيء على خادم يمكن أن يتسرّب أو يُطلَب قضائياً أو يُباع.
+
بلا حسابات
بلا سجلّات
+
+
+
+
+
خارطة طريق التطوير
+
تطوّر SecureBit
+
من أوّل نموذج أوّلي إلى شبكة لامركزية مقاومة للحوسبة الكمّية - مع تحقّق ASN.1 كامل في كلّ طبقة.