{"id":30801060,"url":"https://github.com/bzantium/smart-menlo","last_synced_at":"2026-04-16T12:01:24.073Z","repository":{"id":314251931,"uuid":"1054629197","full_name":"bzantium/smart-menlo","owner":"bzantium","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-21T07:16:13.000Z","size":89,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-21T23:22:43.844Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bzantium.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-11T05:45:43.000Z","updated_at":"2026-03-21T07:16:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"9ab55150-2944-47c6-a8ab-36e8e2713aad","html_url":"https://github.com/bzantium/smart-menlo","commit_stats":null,"previous_names":["bzantium/smart-menlo"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bzantium/smart-menlo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzantium%2Fsmart-menlo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzantium%2Fsmart-menlo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzantium%2Fsmart-menlo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzantium%2Fsmart-menlo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bzantium","download_url":"https://codeload.github.com/bzantium/smart-menlo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzantium%2Fsmart-menlo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31884929,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T11:36:10.202Z","status":"ssl_error","status_checked_at":"2026-04-16T11:36:09.652Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-automation","chrome-extension","menlo-security","network-security","redirect"],"created_at":"2025-09-05T20:50:36.186Z","updated_at":"2026-04-16T12:01:24.067Z","avatar_url":"https://github.com/bzantium.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"assets/icon48.png\" alt=\"Smart Menlo Logo\" style=\"width: 32px; height: 32px;\"\u003e Smart Menlo\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\" style=\"line-height: 1.5;\"\u003e\n  \u003cimg alt=\"Chrome Extension\" src=\"https://img.shields.io/badge/Chrome-Extension-brightgreen.svg\"\u003e\n  \u003cimg alt=\"Manifest V3\" src=\"https://img.shields.io/badge/Manifest-V3-blue.svg\"\u003e\n  \u003ca href=\"LICENSE\" target=\"_blank\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/badge/License-MIT-lightgrey.svg\"\u003e\u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://github.com/bzantium/smart-menlo\" target=\"_blank\"\u003e\u003cimg alt=\"GitHub Repo\" src=\"https://img.shields.io/badge/View_Source-GitHub-181717?logo=github\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://www.readme-i18n.com/bzantium/smart-menlo?lang=en\"\u003eEnglish\u003c/a\u003e |\n  \u003ca href=\"https://www.readme-i18n.com/bzantium/smart-menlo?lang=ko\"\u003e한국어\u003c/a\u003e |\n  \u003ca href=\"https://www.readme-i18n.com/bzantium/smart-menlo?lang=ja\"\u003e日本語\u003c/a\u003e |\n  \u003ca href=\"https://www.readme-i18n.com/bzantium/smart-menlo?lang=zh\"\u003e中文\u003c/a\u003e\n\u003c/div\u003e\n\n---\n\n### The Problem\n\nCorporate environments using Menlo Security face different challenges depending on the VPN solution:\n\n- **Global Protect**: VPN auto-redirects most sites through Menlo, but some URLs (e.g., `x.com`) are missed. There's no easy way to force those through Menlo, and switching between `prod`/`dev` modes requires navigating to an admin page.\n- **Ivanti**: No automatic redirection — when a site is blocked, you manually copy the URL and open it through Menlo. Menlo links from colleagues require stripping the prefix to access the original site.\n\n### The Solution: Smart Menlo 🚀\n\n**Smart Menlo** is a Chrome extension that manages Menlo Security redirection based on your VPN setup. It supports two modes — **Global** and **Ivanti** — to handle different VPN environments automatically.\n\n### 🚧 Development Status\n\nThis project is in active development. If you find an issue or have a suggestion, please [open an issue](https://github.com/bzantium/smart-menlo/issues)!\n\n---\n\n### Features\n\n#### Global Mode (Automatic)\n\nDesigned for **Global Protect** VPN users.\n\n- **VPN Status Detection**: Automatically detects whether the VPN is connected by checking the policy endpoint. Displays `VPN: On (prod/dev)` or `VPN: Off` in the popup.\n- **prod/dev Mode Switching**: Switch between `prod` and `dev` VPN modes directly from the popup — no need to visit the admin page.\n- **Session Timer**: Shows remaining VPN session time with a progress bar. If the native helper is installed, it reads the exact connection time from GlobalProtect logs; otherwise it estimates from when the extension first detects the connection.\n- **Expiry Alert**: The toolbar icon dot blinks as the session nears expiry — slow blink at 1 hour, fast blink at 10 minutes.\n- **Force List**: When the VPN is in `prod` mode, URLs in the force list are always routed through Menlo. This fills the gap for sites that the VPN auto-redirect misses.\n- **Intelligent Link Handling**: Strips the Menlo prefix from URLs that are not in the force list, giving you direct access. When `prod` is off, all Menlo prefixes are stripped automatically.\n\n#### Ivanti Mode (Manual)\n\nDesigned for **Ivanti** VPN users.\n\n- **Manual On/Off Toggle**: Enable or disable Menlo redirection with a single switch.\n- **Force List**: URLs in the force list are always routed through Menlo when the extension is enabled.\n- **Automatic Fallback**: When a site connection fails, Smart Menlo automatically retries through Menlo Security.\n- **Intelligent Link Handling**: Strips the Menlo prefix from non-forced URLs for direct access.\n\n#### Shared Features\n\n- **Force List Management**: Add, edit, and delete URL patterns. Toggle the force list on/off independently.\n- **Open Current Page with Menlo**: One-click button to open the active tab through Menlo Security.\n- **Multi-language Support**: English, 한국어, 日本語, 中文.\n\n---\n\n### Installation\n\n1. Clone this repository:\n    ```sh\n    git clone https://github.com/bzantium/smart-menlo.git\n    ```\n2. Open Chrome and navigate to `chrome://extensions/`.\n3. Enable **Developer mode** in the top-right corner.\n4. Click **Load unpacked** and select the cloned repository folder.\n5. (Optional) Pin the extension to your toolbar for quick access.\n\n#### Session Timer Setup (Optional, Global Mode only)\n\nTo get accurate VPN session remaining time, install the native helper:\n\n```sh\ncd smart-menlo\nbash install.sh\n```\n\nThis registers a lightweight script that reads the GlobalProtect event log to determine when the current VPN session started. It auto-detects your extension ID and installs for all detected Chromium-based browsers (Chrome, Arc, Chromium, Edge).\n\n- **Without the helper**, the timer falls back to estimating from when the extension first detects the VPN connection.\n\n---\n\n### Force List Rules\n\n| Rule Type | Example | Behavior |\n| :--- | :--- | :--- |\n| **Subdomain** (no `/`) | `notion.site` | Matches the domain and any subdomain.\u003cbr\u003e`https://www.notion.site` → Redirects\u003cbr\u003e`https://bzantium.notion.site` → Redirects |\n| **Path** (contains `/`) | `huggingface.co/papers` | Matches URLs starting with that exact path.\u003cbr\u003e`https://huggingface.co/papers/2305.12345` → Redirects\u003cbr\u003e`https://huggingface.co/models` → Does not redirect |\n\n---\n\n### Architecture\n\n```\nsmart-menlo/\n├── manifest.json          # Chrome Extension Manifest V3 config\n├── background.js          # Service worker entry point (dispatcher)\n├── bg-shared.js           # Shared constants, state, URL matching, icon rendering\n├── bg-global.js           # Global mode: VPN policy check, native host query\n├── bg-ivanti.js           # Ivanti mode: navigation handler\n├── popup.html             # Extension popup UI\n├── popup.js               # Shared popup logic (i18n, force list, mode switching)\n├── popup-global.js        # Global mode UI (VPN status, session timer)\n├── popup-ivanti.js        # Ivanti mode UI (enable toggle)\n├── style.css              # Popup styles\n├── install.sh             # Native helper installer (session timer)\n├── native/                # Native messaging host source\n│   ├── com.smartmenlo.sessiond.py    # Python script (reads GP logs)\n│   └── com.smartmenlo.sessiond.json  # Chrome native messaging manifest\n├── _locales/              # Translations (en, ko, ja, zh)\n└── assets/                # Extension icons\n```\n\n---\n\n### Troubleshooting\n\n- **Extension not working?** Refresh it from `chrome://extensions` or toggle the VPN APP mode.\n- **VPN status stuck on \"Switching\"?** Refresh the extension — the switching state will reset automatically.\n- **Force list not working in Global mode?** Ensure the VPN is in `prod` mode and the force list toggle is enabled.\n\n---\n\n### License\n\n[MIT](LICENSE) © Minho Ryu\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbzantium%2Fsmart-menlo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbzantium%2Fsmart-menlo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbzantium%2Fsmart-menlo/lists"}