- maskable-icon.png regenerated: logo at ~66% on the brand background —
inside the maskable safe zone, so Android no longer crops it ('zoomed in').
- index.html: viewport-fit=cover + manifest link without
crossorigin=use-credentials (Firefox Android fails to resolve manifest
icons on credentialed fetches — missing launcher icon).
- custom.css: standalone-mode safe-area padding so app content clears the
system bars; the bands show the theme-correct page background.
86 lines
3.7 KiB
Python
86 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Inject co-op branding + a per-build marker into the built index.html.
|
|
|
|
Non-fatal by design: if the file is missing or upstream changes shape, we
|
|
exit 0 so a cosmetic patch can never break a version bump.
|
|
|
|
The x-coop-build marker makes index.html unique per build, which changes the
|
|
service worker's precache revision — otherwise stale clients keep running the
|
|
old cached app shell (the "my changes never deploy" class of bug).
|
|
"""
|
|
import time
|
|
|
|
PATH = "/app/code/librechat/client/dist/index.html"
|
|
|
|
try:
|
|
html = open(PATH, encoding="utf-8").read()
|
|
except OSError:
|
|
raise SystemExit(0)
|
|
|
|
# 1. Title
|
|
html = html.replace("<title>LibreChat</title>", "<title>Inference Co\u2011op</title>")
|
|
|
|
# 2. Stylesheet + helper script (idempotent — skip if already present)
|
|
if "assets/custom.css" not in html:
|
|
html = html.replace(
|
|
"</title>",
|
|
'</title>\n <link rel="stylesheet" href="assets/custom.css">',
|
|
1,
|
|
)
|
|
if "assets/custom2.js" not in html:
|
|
html = html.replace(
|
|
'<link rel="stylesheet" href="assets/custom.css">',
|
|
'<link rel="stylesheet" href="assets/custom.css">\n <script src="assets/custom2.js"></script>',
|
|
1,
|
|
)
|
|
|
|
# 3. Per-build marker → forces the service worker to refresh the precache
|
|
if "x-coop-build" not in html:
|
|
marker = '<meta name="x-coop-build" content="{}">'.format(int(time.time()))
|
|
html = html.replace("</title>", "</title>\n " + marker, 1)
|
|
|
|
# 3b. PWA chrome: let the page draw under system bars (Android 15 edge-to-edge,
|
|
# display cutouts, iOS safe areas). The page background is theme-correct
|
|
# (custom.css), so the top/bottom bands match the app theme; safe-area
|
|
# padding in custom.css keeps content clear of the bars. Also drop
|
|
# crossorigin="use-credentials" from the manifest link — Firefox Android
|
|
# fails to resolve manifest icons on credentialed fetches (blank/missing
|
|
# launcher icon).
|
|
html = html.replace(
|
|
"initial-scale=1, interactive-widget=resizes-content",
|
|
"initial-scale=1, interactive-widget=resizes-content, viewport-fit=cover",
|
|
)
|
|
html = html.replace(
|
|
'<link rel="manifest" href="./manifest.webmanifest" crossorigin="use-credentials">',
|
|
'<link rel="manifest" href="./manifest.webmanifest">',
|
|
)
|
|
|
|
open(PATH, "w", encoding="utf-8").write(html)
|
|
|
|
# 4. Web manifest identity: co-op name + a 512 icon installable as "any".
|
|
# (theme_color/background_color are fixed by the later Dockerfile sed.)
|
|
MPATH = "/app/code/librechat/client/dist/manifest.webmanifest"
|
|
try:
|
|
import json as _json
|
|
|
|
mf = _json.load(open(MPATH, encoding="utf-8"))
|
|
mf["name"] = "Inference Co\u2011op"
|
|
mf["short_name"] = "Inference"
|
|
mf["description"] = "Member-governed AI inference — private and renewable model choices."
|
|
# Deterministic icon list: explicit any/maskable entries (no dual-purpose
|
|
# values — some Firefox Android versions mishandle "any maskable"), and
|
|
# the launcher-suitable sizes first.
|
|
mf["icons"] = [
|
|
{"src": "assets/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any"},
|
|
{"src": "assets/maskable-icon.png", "sizes": "512x512", "type": "image/png", "purpose": "any"},
|
|
{"src": "assets/maskable-icon.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable"},
|
|
{"src": "assets/apple-touch-icon-180x180.png", "sizes": "180x180", "type": "image/png"},
|
|
{"src": "assets/favicon-32x32.png", "sizes": "32x32", "type": "image/png"},
|
|
{"src": "assets/favicon-16x16.png", "sizes": "16x16", "type": "image/png"},
|
|
]
|
|
open(MPATH, "w", encoding="utf-8").write(_json.dumps(mf, indent=2))
|
|
print("manifest: co-op identity set")
|
|
except OSError:
|
|
raise SystemExit(0)
|
|
print("index.html: co-op branding + build marker injected")
|