Repository navigation
Row-Template 1.4.0: every country's flag, PasarGuard's own apps, live refresh on PasarGuard and Rebecca, panel branding - #14
Merged
Conversation
…sarGuard and Rebecca, panel branding Flags. The page embeds the Twemoji country-flag face (a 64-unit subset of country-flag-emoji-polyfill 0.1.10, CC-BY 4.0, rebuilt reproducibly by tools/subset-flag-font.sh) and puts it first on the flag badge, so all 258 flags draw on every platform -- Chromium on Windows included, which printed the two letters. The six CSS-gradient flags are gone. UK draws the British flag, and XK (Kosovo) joins the registry. The face is its own <style> just before the locale island: after the markup, so first paint does not wait for it, and before the script that creates the badges. PasarGuard. The applications the operator configured in the panel replace the built-in catalogue when there are any (tabs for the platforms they cover, recommended first, the operator's description and one download link in the reader's language; icons are never loaded), and the announcement's own address becomes an "Open link". Both reach the page through a small panel-only extension in the shell. Live refresh. PasarGuard and Rebecca pages poll /<token>/info and translate the panel's own payload (Rebecca nests it under `user`); anything else halts the poller as unsupported instead of repainting a guess. Panel branding. On a fresh install for PasarGuard or Rebecca the installer offers the panel's own subscription title and support link (read-only, SQLite); RT_PANEL_BRANDING=1/0 for scripts, and a manager item for existing installs. Defaults and PasarGuard per-user placeholders are never offered. Fixed: a panel's default "https://t.me/" no longer overrides the support link configured in Row-Template. The size ceiling is 280 KiB (was 200 KiB); every artifact moved by the same +80,575 bytes and is re-pinned (tools/rebaseline.mjs). New guards: every built script compiles, and no two runtime modules share a top-level name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… binary installer - CHANGELOG: 1.4.0 (Unreleased), and 1.3.1 dated 2026-09-27, the day its release was published. - The five READMEs and the documentation site (English, Persian, Arabic): live status on every panel, flags on every platform, the panel's own applications and announcement link, the name and support link offered at install (RT_PANEL_BRANDING), and the new limitations. - The refusal of Rebecca's 0.0.x Docker edition, the READMEs and the docs no longer name `rebecca migrate-binary`: the current rebecca command has no arm for it (dispatch_command) and only prints its usage. They point to Rebecca's binary installer, rebecca-binary.sh. - Design notes: FLAG-RENDERER-AUDIT §18 and a LIVE-POLLING-AUDIT addendum record what 1.4.0 shipped and why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g.env saved An updater from before 1.4.0 backs up the page it replaces after the new release's designs are in the store, so that page matches none of them and the backup records no template; every design changed in 1.4.0. Rolling a real 3X-UI back from 1.4.0 to its 1.3.1 backup restored Row instead of Editorial. The selection in the backup's own config.env (read as data, a known id only) is now tried before Row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the page origin
On a real PasarGuard 5.4.1 with no subscription URL prefix, the import links
the panel builds carry {url} as a bare path (/sub/<token>), which no
application can fetch. At the click, a subscription path that is not already
part of an absolute address is completed with the page's own origin: the link
PasarGuard would have built with the prefix set. Artifact locks re-pinned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rt_restore_from_backup must never restore a backup's config.env (the operator's current branding always stands), and a guard test holds it to not touching that file at all. The 1.4.0 fallback reads one key, TEMPLATE, as data; it now does so through its own helper, and the restore test also asserts that the current branding is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The showcase's Singapore node now draws its flag instead of the letters SG, and every flag is the Twemoji one the page carries. Captured with docs/scripts/capture-previews.mjs from the 1.4.0 build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mirror of /usr/bin without sqlite3 was shared by name between test files, and removed by the exit hook of the process that built it. Under node --test the panel suites run side by side, so when the branding suite (1.4.0) built it and finished first, the PasarGuard suite lost bash and grep mid-run: 12 failures with 'spawnSync bash ENOENT' on GitHub's 4-core runner. Reproduced on Linux with sqlite3 installed and 4 CPUs (823/835), and 835/835 twice with this change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Row-Template 1.4.0, for review. Do not merge before approval; no tag and no release are created by this PR.
What's in it
Every country's flag, on every platform. The page now carries Twemoji's flags as a small colour font (COLR v0, subset to the regional-indicator range, 64 units per em: 51,560 B woff2) and uses it for the flag badge only. All 258 flags draw the same on Windows, Android, iOS, macOS and Linux — including Chromium on Windows, which has no flag glyphs and used to print
TR,SG, … for all but six countries. Flag emoji and ISO codes alike;UK→ 🇬🇧;XKrecognised. The font is placed after the page markup (not in<head>), so first paint does not wait for it. Reproducible build:tools/subset-flag-font.sh; licence:src/fonts/TWEMOJI-LICENSE.txt(CC-BY 4.0).PasarGuard: the operator's own applications. When Settings → Subscription → Applications has entries, the Connect card shows those instead of the built-in list: a tab per platform the list covers (Android, iOS, Windows, macOS, Linux, Android TV, Apple TV), recommended app first, the operator's description in the reader's language, a download link, Import with the link PasarGuard built (a bare
/sub/…path is completed with the page origin at click), and Copy. Icons are never loaded. Import links withjavascript:/data:/file:/… schemes are refused; download links must be http(s).PasarGuard: the announcement's link (
announce_url) is shown under the announcement as Open link (http/https only).Live figures on PasarGuard and Rebecca. The page polls
/<token>/infoand translates each panel's own format (Rebecca nests underuserand uses zoneless UTC timestamps). Anything unrecognised stops polling and keeps the rendered figures.The panel's own name and support link, offered at install (PasarGuard and Rebecca, SQLite, read-only):
Use them for this page? [Y/n]on a fresh interactive install,RT_PANEL_BRANDING=1|0for scripts, manager item Reconfigure → 7 for existing installs. Panel defaults (Subscription, barehttps://t.me/) and PasarGuard titles with{PLACEHOLDERS}are never offered; every value passes the usual validators.Fixes: a panel's default
https://t.me/support link no longer overrides the operator's link (Rebecca default install); rolling back to a backup taken by a pre-1.4.0 updater restores the design selected in that backup's savedconfig.envinstead of Row (onlyTEMPLATEis read, as data; branding is never restored).Changed: +81,052 B per design (68,748 B of it the font; largest design 285,757 B); size budget WARN 272 KiB / FAIL 280 KiB (was 185/200). Tab strips wrap with >4 platforms. Rebecca's Docker refusal now points to
rebecca-binary.shonly (the previously mentionedrebecca migrate-binaryis not routed by Rebecca's currentrebeccacommand).Deferred (documented as known limitations): PasarGuard app icons, Rebecca VPN profiles, PasarGuard page title / Clash templates, MySQL/MariaDB branding read.
Commits
55340ee1.4.0: every country's flag, the panel's own apps, live refresh on PasarGuard and Rebecca, panel brandingdf5d24d1.4.0: changelog, READMEs, documentation; Rebecca's refusal names its binary installer372928eRollback: a backup that names no design takes the selection its config.env saved7000c62PasarGuard: complete a bare subscription path in an import link with the page origine8b0342CHANGELOG: final 1.4.0 sizes; the import-link completion8faf6a3Rollback: read the saved selection through rt_backup_saved_template52d8529docs: refresh the template previews for the 1.4.0 flag font48979e8tests: give each test process its own sqlite-free PATH mirror — fixes a harness race GitHub's first run hit (the shared/usr/binmirror was deleted by whichever suite finished first: 12 ×spawnSync bash ENOENT); reproduced on Linux withsqlite3present and 4 CPUs (823/835), 835/835 twice after the fixVerification
8faf6a3:npm testsqlite3present, 4 CPUs (as GitHub's runner), with48979e8:npm test×2npm teston52d8529npm run verify·npm run lint:sh(shellcheck)npm run build:panelsa0d8c0de…613b), tracked tree cleanRT_PANEL_BRANDING=1a no-op, uninstall; then a fresh 1.4.0 install + uninstall.envblock; update from 1.3.1, the defaultt.mefix, rollback and forward, the panel's name/link, defaults never taken, all 17 designs[Y/n]offer, yes and no paths, uninstall restores the settings row byte-for-byte)All test machines were returned to their original state afterwards (no Row-Template left installed; panel settings restored).
Documentation for this release: iitzSeriZdev/Web-Row-Template (branch
docs/row-template-1.4.0) — to be merged only when 1.4.0 is released, since merging it deploys the site.🤖 Generated with Claude Code