From 8570deaa19b1da12a85924da57fa4d05500a7753 Mon Sep 17 00:00:00 2001
From: CloakHQ
Date: Tue, 23 Jun 2026 02:16:56 +0200
Subject: [PATCH] chore: promote Pro tier in first-launch banner, drop header
badge
---
README.md | 4 ----
cloakbrowser/download.py | 32 ++++++++++++++++++++++++++------
js/src/download.ts | 27 +++++++++++++++++++++------
3 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/README.md b/README.md
index 59cf1c3..7993f58 100644
--- a/README.md
+++ b/README.md
@@ -14,10 +14,6 @@
-
-
-
-
Stealth Chromium that passes every bot detection test.
diff --git a/cloakbrowser/download.py b/cloakbrowser/download.py
index 2a9989b..28c5854 100644
--- a/cloakbrowser/download.py
+++ b/cloakbrowser/download.py
@@ -62,9 +62,18 @@ DOWNLOAD_TIMEOUT = httpx.Timeout(connect=10.0, read=60.0, write=10.0, pool=10.0)
# Auto-update check interval (1 hour)
UPDATE_CHECK_INTERVAL = 3600
+# Pro Chromium major shown in the free-tier welcome banner. Bump at each Pro
+# major release (there is no local constant to derive it from — the live Pro
+# version comes from the network, which we don't call just to print a banner).
+PRO_MAJOR = "148"
-def _show_welcome() -> None:
- """Show welcome message on first launch. Uses a marker file to show only once."""
+
+def _show_welcome(pro: bool = False) -> None:
+ """Show welcome message on first launch. Uses a marker file to show only once.
+
+ The Pro-upsell line is shown to free-tier users only; Pro users get a plain
+ banner (no "running free tier" message, which would be false for them).
+ """
marker = get_cache_dir() / ".welcome_shown"
if marker.exists():
return
@@ -72,7 +81,18 @@ def _show_welcome() -> None:
sys.stderr.write(" CloakBrowser — stealth Chromium for automation\n")
sys.stderr.write(" https://github.com/CloakHQ/CloakBrowser\n")
sys.stderr.write("\n")
- sys.stderr.write(" Donate? https://ko-fi.com/cloakhq\n")
+ if pro:
+ sys.stderr.write(
+ f" CloakBrowser Pro active (v{PRO_MAJOR}) — latest binary, newest patches.\n"
+ )
+ sys.stderr.write(" Pro support → support@cloakbrowser.dev\n")
+ else:
+ free_major = CHROMIUM_VERSION.split(".")[0]
+ sys.stderr.write(
+ f" Running free tier (v{free_major}). "
+ f"Pro = latest binary (v{PRO_MAJOR}) + newest anti-bot patches.\n"
+ )
+ sys.stderr.write(" Stay ahead of detection → https://cloakbrowser.dev\n")
sys.stderr.write(" Star us if CloakBrowser helps your project!\n")
sys.stderr.write("\n")
try:
@@ -232,7 +252,7 @@ def _ensure_pro_binary(license_key: str) -> str:
if binary_path.exists() and _is_executable(binary_path):
logger.debug("Pro binary found in cache: %s (version %s)", binary_path, effective)
- _show_welcome()
+ _show_welcome(pro=True)
_maybe_trigger_pro_update_check(license_key)
return str(binary_path)
@@ -243,7 +263,7 @@ def _ensure_pro_binary(license_key: str) -> str:
binary_path = get_binary_path(version, pro=True)
if binary_path.exists() and _is_executable(binary_path):
logger.debug("Pro binary found in cache: %s (version %s)", binary_path, version)
- _show_welcome()
+ _show_welcome(pro=True)
return str(binary_path)
logger.info("Downloading Pro Chromium %s for %s...", version, get_platform_tag())
@@ -264,7 +284,7 @@ def _ensure_pro_binary(license_key: str) -> str:
except OSError:
pass
- _show_welcome()
+ _show_welcome(pro=True)
return str(binary_path)
diff --git a/js/src/download.ts b/js/src/download.ts
index eb114a3..cd92a6b 100644
--- a/js/src/download.ts
+++ b/js/src/download.ts
@@ -38,6 +38,10 @@ import { resolveLicenseKey, validateLicense, getProLatestVersion } from "./licen
const DOWNLOAD_TIMEOUT_MS = 600_000; // 10 minutes
const UPDATE_CHECK_INTERVAL_MS = 3_600_000; // 1 hour
+// Pro Chromium major shown in the welcome banner. Bump at each Pro major release
+// (no local constant to derive it from — the live Pro version comes from the
+// network, which we don't call just to print a banner). Mirrors download.py.
+const PRO_MAJOR = "148";
/**
* A downloaded binary could not be authenticated (bad/missing signature,
@@ -205,15 +209,26 @@ export async function checkForUpdate(): Promise {
// Welcome message (shown once per install)
// ---------------------------------------------------------------------------
-function showWelcome(): void {
+function showWelcome(pro = false): void {
const marker = path.join(getCacheDir(), ".welcome_shown");
if (fs.existsSync(marker)) return;
console.error();
console.error(" CloakBrowser — stealth Chromium for automation");
console.error(" https://github.com/CloakHQ/CloakBrowser");
console.error();
- console.error(" Issues? https://github.com/CloakHQ/CloakBrowser/issues");
- console.error(" Donate? https://ko-fi.com/cloakhq");
+ if (pro) {
+ console.error(
+ ` CloakBrowser Pro active (v${PRO_MAJOR}) — latest binary, newest patches.`,
+ );
+ console.error(" Pro support → support@cloakbrowser.dev");
+ } else {
+ const freeMajor = CHROMIUM_VERSION.split(".")[0];
+ console.error(
+ ` Running free tier (v${freeMajor}). ` +
+ `Pro = latest binary (v${PRO_MAJOR}) + newest anti-bot patches.`,
+ );
+ console.error(" Stay ahead of detection → https://cloakbrowser.dev");
+ }
console.error(" Star us if CloakBrowser helps your project!");
console.error();
try {
@@ -590,7 +605,7 @@ async function ensureProBinary(licenseKey: string): Promise {
const effectivePath = getBinaryPath(effective, true);
if (fs.existsSync(effectivePath) && isExecutable(effectivePath)) {
- showWelcome();
+ showWelcome(true);
maybeTriggerProUpdateCheck(licenseKey);
return effectivePath;
}
@@ -602,7 +617,7 @@ async function ensureProBinary(licenseKey: string): Promise {
const versionPath = getBinaryPath(version, true);
if (fs.existsSync(versionPath) && isExecutable(versionPath)) {
- showWelcome();
+ showWelcome(true);
return versionPath;
}
@@ -628,7 +643,7 @@ async function ensureProBinary(licenseKey: string): Promise {
// Non-fatal
}
- showWelcome();
+ showWelcome(true);
return downloadedPath;
}