Skip to content

Row-Template 1.4.0: every country's flag, PasarGuard's own apps, live refresh on PasarGuard and Rebecca, panel branding - #14

Merged
iitzSeriZdev merged 8 commits into
mainfrom
release/v1.4.0
Sep 28, 2026
Merged

iitzSeriZdev merged 8 commits into
mainfrom
release/v1.4.0

Conversation

@iitzSeriZdev

@iitzSeriZdev iitzSeriZdev commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

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 → 🇬🇧; XK recognised. 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 with javascript:/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>/info and translates each panel's own format (Rebecca nests under user and 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|0 for scripts, manager item Reconfigure → 7 for existing installs. Panel defaults (Subscription, bare https://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 saved config.env instead of Row (only TEMPLATE is 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.sh only (the previously mentioned rebecca migrate-binary is not routed by Rebecca's current rebecca command).

Deferred (documented as known limitations): PasarGuard app icons, Rebecca VPN profiles, PasarGuard page title / Clash templates, MySQL/MariaDB branding read.

Commits

  • 55340ee 1.4.0: every country's flag, the panel's own apps, live refresh on PasarGuard and Rebecca, panel branding
  • df5d24d 1.4.0: changelog, READMEs, documentation; Rebecca's refusal names its binary installer
  • 372928e Rollback: a backup that names no design takes the selection its config.env saved
  • 7000c62 PasarGuard: complete a bare subscription path in an import link with the page origin
  • e8b0342 CHANGELOG: final 1.4.0 sizes; the import-link completion
  • 8faf6a3 Rollback: read the saved selection through rt_backup_saved_template
  • 52d8529 docs: refresh the template previews for the 1.4.0 flag font
  • 48979e8 tests: give each test process its own sqlite-free PATH mirror — fixes a harness race GitHub's first run hit (the shared /usr/bin mirror was deleted by whichever suite finished first: 12 × spawnSync bash ENOENT); reproduced on Linux with sqlite3 present and 4 CPUs (823/835), 835/835 twice after the fix

Verification

Suite Result
Linux CI (clean clone, WSL Ubuntu) on 8faf6a3: npm test 835 / 835 pass
Linux, sqlite3 present, 4 CPUs (as GitHub's runner), with 48979e8: npm test ×2 835 / 835 both runs
Windows (Git Bash) npm test on 52d8529 828 pass, 0 fail, 7 skipped (symlink/systemd cases that need Linux)
npm run verify · npm run lint:sh (shellcheck) all checks passed · 13 scripts clean
npm run build:panels 51 shells (17 designs × 3 panels)
Release packaging, built twice byte-identical (a0d8c0de…613b), tracked tree clean
Release preflight (checksums, two identical builds, 17 designs × 3 panels, flag face in every page, published v1.3.1 downloads) 10 / 10
Real 3X-UI 3.8.5: update from the published 1.3.1, rollback to its backup and forward again, all 17 designs served, RT_PANEL_BRANDING=1 a no-op, uninstall; then a fresh 1.4.0 install + uninstall 43 / 43
Real PasarGuard 5.4.1 (Docker): update from 1.3.1, the operator's apps + announcement link on the page, rollback and forward, the panel's name/link taken (settings only read), all 17 designs 40 / 40
Real Rebecca 1.x (binary): PasarGuard uninstall left no .env block; update from 1.3.1, the default t.me fix, rollback and forward, the panel's name/link, defaults never taken, all 17 designs 39 / 39
Interactive installer over a real pty on Rebecca (the [Y/n] offer, yes and no paths, uninstall restores the settings row byte-for-byte) 11 / 11
Final flags check and cleanup (no Row-Template left installed) 3 / 3
Real-browser, real panels (Chromium, WebKit, Firefox) PasarGuard 34/34 · Rebecca 21/21 · 3X-UI 18/18
Fixture E2E: 8 designs × (PasarGuard, PasarGuard without apps, Rebecca) × 3 engines 911 / 911
Performance (Chromium, 4× CPU, median of 9, 1.3.1 → 1.4.0) FCP on 3G: row 564→588 ms, meter 1020→608 ms; DCL +~0.4 s on 3G, +~0.1 s on 4G; script time unchanged

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

iitzSeriZ and others added 7 commits September 28, 2026 19:41
…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>
@iitzSeriZdev
iitzSeriZdev merged commit e71e72a into main Sep 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant