{"id":48110042,"url":"https://github.com/prohunter00017/envmanager","last_synced_at":"2026-04-04T16:02:52.097Z","repository":{"id":349153773,"uuid":"1201261659","full_name":"prohunter00017/envmanager","owner":"prohunter00017","description":"A free, open-source macOS app for managing system-wide environment variables — no Terminal required. Built with Tauri 2 + React.","archived":false,"fork":false,"pushed_at":"2026-04-04T14:48:01.000Z","size":475,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T14:49:06.842Z","etag":null,"topics":["desktop-app","developer-tools","environment-variables","launchctl","macos","open-source","react","rust","tauri"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prohunter00017.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2026-04-04T12:40:36.000Z","updated_at":"2026-04-04T14:48:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/prohunter00017/envmanager","commit_stats":null,"previous_names":["prohunter00017/envmanager"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/prohunter00017/envmanager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prohunter00017%2Fenvmanager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prohunter00017%2Fenvmanager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prohunter00017%2Fenvmanager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prohunter00017%2Fenvmanager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prohunter00017","download_url":"https://codeload.github.com/prohunter00017/envmanager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prohunter00017%2Fenvmanager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31405226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: 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":["desktop-app","developer-tools","environment-variables","launchctl","macos","open-source","react","rust","tauri"],"created_at":"2026-04-04T16:02:51.914Z","updated_at":"2026-04-04T16:02:52.075Z","avatar_url":"https://github.com/prohunter00017.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"src-tauri/icons/icon.png\" alt=\"EnvManager\" width=\"128\" height=\"128\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eEnvManager\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA free, open-source macOS app for managing system-wide environment variables — no Terminal required.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/prohunter00017/envmanager/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/prohunter00017/envmanager?label=Download\u0026style=for-the-badge\" alt=\"Download Latest Release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge\" alt=\"MIT License\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/prohunter00017/envmanager/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/prohunter00017/envmanager/release.yml?label=CI\u0026style=for-the-badge\" alt=\"Build Status\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## What It Does\n\nEnvManager gives you a clean, native GUI to manage your Mac's environment variables. Add, edit, delete, search, import, and export variables — they're applied system-wide instantly and automatically restored every time you log in.\n\n**No Terminal. No config files. No developer tools needed.**\n\nBuilt with [Tauri 2](https://tauri.app/) (Rust) and React for a fast, lightweight, native experience.\n\n## Key Features\n\n| Feature | Details |\n|---------|---------|\n| Visual editor | Click-to-edit table with inline validation, keyboard navigation, and tab-to-next-field |\n| Auto-save | Changes are saved and applied automatically 2 seconds after you stop editing |\n| Variable categories | Organize variables into collapsible groups (General, API Keys, Paths, etc.) with per-row category selector and inline new-category creation |\n| Variable interpolation | Reference other vars with `${VAR}` or `$VAR`, embed shell output with `$(command)`, escape with `$$` |\n| Sensitive value masking | Keys containing SECRET, TOKEN, KEY, PASSWORD, etc. are masked by default with an eye toggle to reveal |\n| Quick copy | One-click copy button on every value with checkmark feedback |\n| Delete confirmation | Confirmation dialog before deleting variables — prevents accidental loss |\n| File-watching agent | LaunchAgent monitors `env.json` via `WatchPaths` — changes apply instantly, not just at login |\n| Config file viewer | Built-in viewer/editor for `env.json`, `~/.zshrc`, and LaunchAgent plist with syntax highlighting for managed blocks |\n| Tracking variable cleanup | Stores `_ENVMANAGER_VARS` to track and unset removed variables across sessions |\n| Shell profile sync | Automatically exports variables to `~/.zshrc` so they work in Terminal and CLI tools |\n| System-wide application | Applies via `launchctl setenv` — works across all apps |\n| Persistence | Auto-restores variables at login via LaunchAgent + Login Item |\n| Search \u0026 filter | Filter variables by key, value, or category |\n| Import / Export | JSON import/export for backup, sharing, or team onboarding — supports both array and legacy object formats |\n| Duplicate detection | Real-time inline warnings for conflicting keys |\n| Dark \u0026 Light theme | OKLCH-based dark and light themes with one-click toggle in the title bar |\n| Atomic file operations | Crash-safe writes with tmp+rename pattern |\n| Thread-safe backend | Mutex-protected file I/O prevents race conditions |\n| Accessibility | Full keyboard navigation, focus traps, ARIA labels, screen reader support |\n\n## Installation\n\n### 1. Download\n\nGo to the [Releases page](https://github.com/prohunter00017/envmanager/releases/latest) and download the `.dmg` for your Mac (Apple Silicon).\n\n### 2. Install\n\n1. Open the downloaded `.dmg` file\n2. Drag **EnvManager** into the **Applications** folder\n\n### 3. First Launch\n\nSince EnvManager is distributed without an Apple Developer certificate (it's free and open source), macOS Gatekeeper will block the first launch. Use one of these methods to open it:\n\n**Option A — Right-click to open (recommended):**\n\n1. Open **Applications** in Finder\n2. **Right-click** (or Control-click) on **EnvManager**\n3. Click **Open**, then **Open** again in the confirmation dialog\n\n**Option B — Terminal (one-time command):**\n\nIf right-click doesn't work, run this in Terminal to remove the quarantine flag:\n\n```bash\nxattr -cr /Applications/EnvManager.app\n```\n\nThen open EnvManager normally.\n\n**Option C — System Settings:**\n\n1. Try to open EnvManager normally (it will be blocked)\n2. Go to **System Settings → Privacy \u0026 Security**\n3. Scroll down and click **\"Open Anyway\"** next to the EnvManager message\n\nAfter the first successful launch, the app opens normally every time.\n\n### 4. Updating to a New Version\n\nWhen you install a new version from a fresh DMG, macOS may ask you to re-trust the app (each build produces a new ad-hoc code signature). To avoid this:\n\n1. Quit EnvManager if it's running\n2. Open the new DMG and drag **EnvManager** to **Applications** (replace the old version)\n3. Remove the quarantine flag:\n\n```bash\nxattr -cr /Applications/EnvManager.app\n```\n\nOr download and run the `install.sh` helper script included with each release.\n\nYour environment variables and settings in `~/Library/Application Support/EnvManager/` are preserved across updates.\n\n## How It Works\n\n```\n┌─────────────────────────────────────────────────────────┐\n│  EnvManager.app (React + Tauri)                         │\n│                                                         │\n│  ┌──────────┐    Save    ┌──────────────────────────┐   │\n│  │  GUI     │ ─────────► │  Rust Backend            │   │\n│  │  Editor  │            │  ┌────────────────────┐  │   │\n│  └──────────┘            │  │ Validate keys      │  │   │\n│                          │  │ Atomic JSON write   │  │   │\n│                          │  │ launchctl setenv    │  │   │\n│                          │  └────────────────────┘  │   │\n│                          └──────────────────────────┘   │\n└─────────────────────────────────────────────────────────┘\n                             │\n                    ┌────────┼────────┐\n                    ▼                 ▼\n           ~/Library/               ~/Library/\n           Application Support/     LaunchAgents/\n           EnvManager/env.json      com.envmanager.env.plist\n           (persistent store)       (re-applies at login)\n```\n\n- **Storage**: Variables are persisted to `~/Library/Application Support/EnvManager/env.json` as `[{key, value, category}]` arrays\n- **Auto-save**: Changes are automatically saved and applied 2 seconds after you stop editing\n- **Interpolation**: Values support `${VAR}`, `$VAR` (variable references), `$(command)` (shell output), and `$$` (literal `$`)\n- **Application**: Calls `launchctl setenv KEY RESOLVED_VALUE` for every variable with interpolated values\n- **Shell sync**: Exports variables to `~/.zshrc` in a managed block (`# \u003e\u003e\u003e EnvManager \u003e\u003e\u003e` / `# \u003c\u003c\u003c EnvManager \u003c\u003c\u003c`) so CLI tools see them too\n- **File-watching**: The LaunchAgent uses `WatchPaths` to monitor `env.json` — any change (even from a text editor) triggers re-application immediately\n- **Tracking cleanup**: A `_ENVMANAGER_VARS` tracking variable remembers which variables were set, so removed variables are properly unset across sessions\n- **Persistence**: A LaunchAgent is auto-installed so variables survive reboots and logouts\n- **Deletion**: Removing a variable requires confirmation, then takes effect immediately\n- **Note**: Already-running apps need to be restarted to pick up new variables (no reboot required)\n\n## Caveats\n\n- **PATH**: macOS overrides `PATH` at shell startup (via `/usr/libexec/path_helper` and shell profiles). Setting `PATH` via `launchctl setenv` will not have the expected effect in Terminal shells. Use your shell's profile (`~/.zshrc`, `~/.bashrc`) instead.\n- **DYLD_\\* variables**: macOS strips `DYLD_LIBRARY_PATH`, `DYLD_FRAMEWORK_PATH`, and other `DYLD_*` variables from the environment for security (System Integrity Protection). These cannot be set via `launchctl`.\n- **Already-running apps**: Environment variable changes only affect apps launched *after* the change. Already-running apps must be restarted.\n- **GUI vs Terminal**: Variables set via `launchctl setenv` are visible to GUI apps launched from Finder/Spotlight. Terminal apps see them too, but shell profiles may override them.\n\n## Screenshots\n\n\u003c!-- TODO: Add screenshots when available --\u003e\n\n## Uninstalling\n\n1. Quit EnvManager\n2. Delete `EnvManager.app` from Applications\n3. Optionally remove stored data:\n   ```bash\n   rm -rf ~/Library/Application\\ Support/EnvManager\n   rm -f ~/Library/LaunchAgents/com.envmanager.env.plist\n   ```\n\n## Building from Source\n\nRequires macOS with Xcode Command Line Tools, Rust, and Node.js 22+. See [CONTRIBUTING.md](CONTRIBUTING.md) for full setup instructions.\n\n```bash\ngit clone https://github.com/prohunter00017/envmanager.git\ncd envmanager\npnpm install\npnpm tauri dev      # development with hot reload\npnpm tauri build    # production .app + .dmg\n```\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Frontend | React 19, TypeScript, Tailwind CSS v4, Vite 7 |\n| Backend | Rust, Tauri 2 |\n| System integration | `launchctl`, LaunchAgent, Login Items (via AppleScript) |\n| Distribution | GitHub Actions CI/CD, Apple Silicon DMG |\n\n## Project Structure\n\n```\nenvmanager/\n├── src/                        # React frontend\n│   ├── App.tsx                 # Main application logic\n│   ├── main.tsx                # React entry point\n│   ├── index.css               # Tailwind CSS v4 + OKLCH theme variables\n│   ├── types/                  # TypeScript types\n│   ├── hooks/\n│   │   └── useTauri.ts         # Tauri command wrappers\n│   └── components/\n│       ├── EnvTable.tsx        # Editable variable table with masking \u0026 copy\n│       ├── Toolbar.tsx         # Search, category filter, Add, Save, Import/Export, Reset\n│       ├── StatusBar.tsx       # Data dir + LaunchAgent/Login Item/Shell status\n│       ├── FileViewer.tsx      # Config file viewer \u0026 editor\n│       ├── InfoBanner.tsx      # Info banner about launchctl\n│       ├── ConfirmDialog.tsx   # Reusable confirmation modal\n│       └── Toast.tsx           # Toast notification system\n├── src-tauri/\n│   ├── Cargo.toml              # Rust dependencies\n│   ├── tauri.conf.json         # Tauri configuration\n│   ├── build.rs                # Tauri build script\n│   ├── entitlements.plist      # macOS entitlements\n│   ├── capabilities/\n│   │   └── default.json        # Tauri permission capabilities\n│   ├── icons/                  # App icons (all sizes)\n│   ├── dmg/                    # DMG background assets\n│   └── src/\n│       └── main.rs             # Tauri commands + business logic\n├── scripts/\n│   ├── generate-icon.mjs       # SVG → PNG icon generation\n│   ├── generate-ico-icns.mjs   # ICO/ICNS generation\n│   ├── generate-dmg-background.mjs  # DMG background generator\n│   └── install.sh              # Post-install Gatekeeper helper\n├── .github/\n│   └── workflows/\n│       └── release.yml         # CI/CD: build + release on tag push\n├── index.html\n├── vite.config.ts\n├── tsconfig.json\n├── package.json\n├── CHANGELOG.md\n├── CONTRIBUTING.md\n└── LICENSE\n```\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## Author\n\n**Hamza Zoubir** — [GitHub](https://github.com/prohunter00017)\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprohunter00017%2Fenvmanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprohunter00017%2Fenvmanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprohunter00017%2Fenvmanager/lists"}