{"id":26238777,"url":"https://github.com/zeybek/camouflage","last_synced_at":"2026-02-08T21:18:31.802Z","repository":{"id":300277860,"uuid":"945245947","full_name":"zeybek/camouflage","owner":"zeybek","description":"Camouflage is a VS Code extension that helps protect sensitive environment variables by hiding their values in .env files","archived":false,"fork":false,"pushed_at":"2025-12-21T23:12:27.000Z","size":414,"stargazers_count":32,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-23T10:35:39.164Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://marketplace.visualstudio.com/items?itemName=zeybek.camouflage","language":"TypeScript","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/zeybek.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","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-03-09T01:32:24.000Z","updated_at":"2025-12-21T23:12:29.000Z","dependencies_parsed_at":"2025-06-20T20:48:35.163Z","dependency_job_id":null,"html_url":"https://github.com/zeybek/camouflage","commit_stats":null,"previous_names":["zeybek/camouflage"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/zeybek/camouflage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeybek%2Fcamouflage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeybek%2Fcamouflage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeybek%2Fcamouflage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeybek%2Fcamouflage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zeybek","download_url":"https://codeload.github.com/zeybek/camouflage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeybek%2Fcamouflage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29244639,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-08T21:00:43.743Z","status":"ssl_error","status_checked_at":"2026-02-08T20:59:20.374Z","response_time":57,"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":["dotenv"],"created_at":"2025-03-13T06:18:52.135Z","updated_at":"2026-02-08T21:18:31.796Z","avatar_url":"https://github.com/zeybek.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Camouflage - Configuration Value Hider\n\n![Camouflage Banner](./images/screenshot.png)\n\n[![CI](https://github.com/zeybek/camouflage/actions/workflows/ci.yml/badge.svg)](https://github.com/zeybek/camouflage/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/zeybek/camouflage/actions/workflows/codeql.yml/badge.svg)](https://github.com/zeybek/camouflage/actions/workflows/codeql.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/zeybek.camouflage)](https://marketplace.visualstudio.com/items?itemName=zeybek.camouflage)\n[![codecov](https://codecov.io/gh/zeybek/camouflage/graph/badge.svg?token=T0bRV39DBM)](https://codecov.io/gh/zeybek/camouflage)\n\nCamouflage is a VS Code extension that helps protect sensitive values in configuration files by hiding them visually. Supports multiple file formats including `.env`, `.json`, `.yaml`, `.properties`, `.toml`, and `.sh` files. Perfect for screen sharing, recordings, or taking screenshots without exposing sensitive information.\n\n## Features\n\n- 🔒 **Automatic Value Hiding**: Automatically hides values in configuration files while preserving the keys\n- 📁 **Multi-Format Support**: Works with `.env`, `.json`, `.yaml`, `.yml`, `.properties`, `.ini`, `.conf`, `.toml`, and `.sh` files\n- 🔗 **Nested Key Support**: Supports nested keys in JSON and YAML files (e.g., `database.password`)\n- 🎨 **Multiple Hiding Styles**: Choose from different styles to hide your values:\n  - Text (default): `************************`\n  - Dotted: `••••••••••••`\n  - Stars: `************`\n  - Scramble: `sroedpaswd` (randomly shuffled characters)\n  - Custom: Define your own pattern (e.g., `###`)\n- 🎯 **Quick Toggle**: Easily toggle visibility via status bar or context menu\n- 🌈 **Customizable Appearance**: Configure colors and patterns to match your theme\n- 👁️ **Value Preview**: Optional value preview on hover\n- 🔍 **Selective Hiding**: Hide only specific keys based on patterns or exclude certain keys\n- 📂 **File Exclusion**: Exclude specific files from Camouflage protection\n- ⌨️ **Keyboard Shortcuts**: Quickly toggle visibility with customizable keyboard shortcuts\n- 🖱️ **Organized Context Menu**: All options grouped under a single \"Camouflage\" menu\n- 📊 **Status Bar Indicators**: See the current state and mode at a glance\n- 🔧 **Indented Code Support**: Works with indented export statements in shell scripts\n\n## Supported File Formats\n\n| Format        | Extensions                          | Nested Keys    |\n| ------------- | ----------------------------------- | -------------- |\n| Environment   | `.env`, `.env.*`, `*.env`, `.envrc` | No             |\n| Shell Scripts | `.sh`                               | No             |\n| JSON          | `.json`                             | Yes            |\n| YAML          | `.yaml`, `.yml`                     | Yes            |\n| Properties    | `.properties`, `.ini`, `.conf`      | No             |\n| TOML          | `.toml`                             | Yes (sections) |\n\n## Installation\n\n1. Open VS Code\n2. Press `Ctrl+P` / `Cmd+P`\n3. Type `ext install zeybek.camouflage`\n4. Press Enter\n\n## Requirements\n\n- VS Code 1.96.0 or higher\n\n## Usage\n\n### Basic Usage\n\n1. Open any supported configuration file (`.env`, `.json`, `.yaml`, etc.)\n2. Values are automatically hidden (if auto-hide is enabled)\n3. Use the status bar toggle to show/hide values\n4. Right-click in the editor for context menu options\n\n### Status Bar Control\n\nThe extension adds a status bar item that shows the current state:\n\n- 👁️‍🗨️ **Camouflage: On** - All values are hidden\n- 👁️‍🗨️ **Camouflage: Selective** - Only selected values are hidden\n- 👁️ **Camouflage: Off** - Values are visible\n\nClick the status bar item to toggle between On/Off states.\n\n### Context Menu Options\n\nRight-click on any line in your configuration file to access the **Camouflage** submenu with these organized options:\n\n```\n🎭 Camouflage\n├── Hide Values / Reveal Values     ← Toggle global hiding\n├─────────────────────────────────\n├── Toggle This Value               ← Toggle current value visibility\n├── Exclude This Key                ← Add key to exclude list\n├─────────────────────────────────\n├── Toggle Selective Mode           ← Switch hiding mode\n├─────────────────────────────────\n├── Exclude This File               ← Stop hiding in current file\n├── Include This File               ← Resume hiding in current file\n├─────────────────────────────────\n└── Change Style →                  ← Submenu for hiding styles\n    ├── Text\n    ├── Dotted\n    ├── Stars\n    └── Scramble\n```\n\n**Hiding Styles:**\n\n- **Text**: Standard text replacement (e.g., `************************`)\n- **Dotted**: Uses dot characters (e.g., `••••••••••••`)\n- **Stars**: Uses asterisk characters (e.g., `************`)\n- **Scramble**: Randomly shuffles characters (e.g., `sroedpasw`)\n\n### Keyboard Shortcuts\n\n- `Ctrl+Shift+H` / `Cmd+Shift+H`: Hide all values\n- `Ctrl+Shift+R` / `Cmd+Shift+R`: Reveal all values\n- `Ctrl+Shift+T` / `Cmd+Shift+T`: Toggle the value under cursor\n- `Ctrl+Shift+S` / `Cmd+Shift+S`: Toggle selective hiding mode\n\n## Configuration\n\nAccess settings through:\n\n- Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`) → \"Preferences: Open Settings (UI)\"\n- Search for \"Camouflage\"\n\n### Available Settings\n\n#### General\n\n- `camouflage.enabled`: Enable/disable the extension\n- `camouflage.autoHide`: Automatically hide values when opening files\n\n#### Files\n\n- `camouflage.files.patterns`: File patterns to apply hiding (e.g., `.env*`, `*.json`, `*.yaml`)\n- `camouflage.files.excludedFiles`: List of file paths to exclude from Camouflage (absolute or relative paths)\n- `camouflage.files.enabledParsers`: List of parsers to enable (`env`, `json`, `yaml`, `properties`, `toml`)\n\n#### Parser Options\n\n- `camouflage.parserOptions.maxNestedDepth`: Maximum depth to parse for nested keys in JSON/YAML (default: 5)\n\n#### Appearance\n\n- `camouflage.appearance.style`: Hiding style (text, dotted, stars, scramble)\n- `camouflage.appearance.hiddenText`: Text to display for hidden values\n- `camouflage.appearance.textColor`: Color of hidden text\n  - `auto`: Automatically uses your current theme's text color\n  - Custom CSS color: Use any valid CSS color value (e.g., `#FFFFFF`, `white`, `rgba(255,255,255,0.8)`)\n- `camouflage.appearance.backgroundColor`: Background color for hidden values\n  - `auto`: Automatically uses your current theme's primary color\n  - `transparent`: No background color\n  - Custom CSS color: Use any valid CSS color value (e.g., `#2F7FE5`, `red`, `rgba(255,0,0,0.5)`)\n\n#### Selective Hiding\n\n- `camouflage.selective.enabled`: Enable selective hiding mode (only hide keys matching patterns)\n- `camouflage.selective.keyPatterns`: Patterns to match keys that should be hidden\n- `camouflage.selective.excludeKeys`: Patterns to match keys that should never be hidden\n\n#### Hover\n\n- `camouflage.hover.showPreview`: Show value preview on hover\n- `camouflage.hover.message`: Custom message to show on hover\n\n## Examples\n\n### Multi-Format Support\n\nCamouflage works seamlessly across different configuration file formats:\n\n#### Environment Files (.env)\n\n```env\n# All values are hidden\nAPI_KEY=************************\nDATABASE_URL=************************\nSECRET_TOKEN=************************\n```\n\n#### JSON Files (.json)\n\n```json\n{\n  \"apiKey\": \"************************\",\n  \"database\": {\n    \"host\": \"************************\",\n    \"password\": \"************************\"\n  }\n}\n```\n\nNested keys are displayed as `database.host`, `database.password` in hover messages.\n\n#### YAML Files (.yaml)\n\n```yaml\napi:\n  key: '************************'\ndatabase:\n  host: '************************'\n  password: '************************'\n```\n\n#### Shell Scripts (.sh)\n\n```bash\n#!/bin/bash\nexport API_KEY=************************\nexport DATABASE_URL=************************\nDB_PASSWORD=************************\n```\n\n#### Properties Files (.properties)\n\n```properties\napi.key=************************\ndatabase.host=************************\ndatabase.password=************************\n```\n\n#### TOML Files (.toml)\n\n```toml\n[database]\nhost = \"************************\"\npassword = \"************************\"\n\n[api]\nkey = \"************************\"\n```\n\n### Different Hiding Styles\n\n```env\n# Text Style (Default)\nAPI_KEY=************************\n\n# Dotted Style\nSECRET_KEY=••••••••••••\n\n# Stars Style\nPASSWORD=************\n\n# Scramble Style\nDATABASE_URL=ettsaab:dlocmonpg///:\n```\n\n### Selective Hiding\n\nYou can configure Camouflage to only hide specific keys by enabling selective hiding:\n\n```json\n// Enable selective hiding\n\"camouflage.selective.enabled\": true,\n\n// Define patterns for keys to hide\n\"camouflage.selective.keyPatterns\": [\n  \"*KEY*\",   // Contains \"KEY\" anywhere (e.g., API_KEY, KEY_VALUE, MY_KEY_HERE)\n  \"API*\",    // Starts with \"API\" (e.g., API_KEY, API_SECRET)\n  \"*SECRET\", // Ends with \"SECRET\" (e.g., JWT_SECRET, CLIENT_SECRET)\n  \"PASSWORD\", // Exact match only (only \"PASSWORD\", not \"DB_PASSWORD\")\n  \"*password*\", // Contains \"password\" (works with nested keys like database.password)\n  \"DB*\",     // Starts with \"DB\" (e.g., DB_HOST, DB_USER)\n  \"*DB*\",    // Contains \"DB\" anywhere (e.g., MONGODB_URI, RDS_DB_NAME)\n  \"DATABASE*\", // Starts with \"DATABASE\" (e.g., DATABASE_URL)\n  \"*DATABASE*\", // Contains \"DATABASE\" anywhere (e.g., MY_DATABASE_PASSWORD)\n  \"PORT\"     // Exact match only (only \"PORT\", not \"REPORT\")\n],\n\n// Define patterns for keys to never hide\n\"camouflage.selective.excludeKeys\": [\n  \"PUBLIC*\", // Starts with \"PUBLIC\" (e.g., PUBLIC_URL, PUBLIC_KEY)\n  \"*_TEST\",  // Ends with \"_TEST\" (e.g., API_TEST, SECRET_TEST)\n  \"DEBUG\"    // Exact match only (only \"DEBUG\")\n]\n```\n\n#### Pattern Matching Rules\n\nThe same pattern matching rules apply to both `keyPatterns` and `excludeKeys`:\n\n- `*KEY*` - Matches keys containing \"KEY\" anywhere\n- `KEY*` - Matches keys starting with \"KEY\"\n- `*KEY` - Matches keys ending with \"KEY\"\n- `KEY` - Matches only the exact key \"KEY\"\n\n**Note**: For nested keys (JSON/YAML), the full key path is used for matching. For example, `database.password` can be matched with `*password*` or `database.*`.\n\nWith these settings:\n\n```env\n# This will be hidden (matches *KEY* pattern)\nAPI_KEY=hidden_value\n\n# This will be hidden (matches API* pattern)\nAPI_SECRET=hidden_value\n\n# This will be hidden (matches *SECRET pattern)\nJWT_SECRET=hidden_value\n\n# This will NOT be hidden (doesn't match any pattern)\nSOME_VALUE=visible_value\n\n# This will NOT be hidden (matches PUBLIC* exclude pattern)\nPUBLIC_URL=https://example.com\n\n# This will NOT be hidden (matches *_TEST exclude pattern)\nAPI_TEST=test_value\n\n# This will NOT be hidden (matches DEBUG exclude pattern)\nDEBUG=true\n```\n\nWhen selective hiding is disabled, all values will be hidden regardless of their keys (except those matching exclude patterns).\n\n### Quick Value Toggling\n\nYou can quickly toggle individual values by:\n\n1. Placing your cursor on the line containing the value\n2. Right-clicking and selecting \"Toggle Selected Value\" from the context menu\n3. Or using the keyboard shortcut `Ctrl+Shift+T` / `Cmd+Shift+T`\n\nWhen toggling a value, you'll be prompted to choose a pattern type:\n\n- **Exact match**: Only affects the specific key (e.g., \"API_KEY\")\n- **Starts with**: Affects all keys starting with the pattern (e.g., \"API\\_\\*\")\n- **Ends with**: Affects all keys ending with the pattern (e.g., \"\\*\\_KEY\")\n- **Contains**: Affects all keys containing the pattern (e.g., \"_KEY_\")\n\nThis adds or removes the selected pattern from the exclude list, effectively toggling visibility for all matching keys.\n\n### Adding to Exclude List\n\nYou can also add keys to the exclude list without removing existing patterns:\n\n1. Place your cursor on the line containing the value\n2. Right-click and select \"Add to Exclude List\" from the context menu\n3. Choose the pattern type (exact match, starts with, ends with, or contains)\n\nThis gives you more control over which values are hidden or visible based on your specific needs.\n\n### File Exclusion\n\nYou can exclude specific files from Camouflage protection:\n\n#### Using Context Menu\n\n1. Open the file you want to exclude\n2. Right-click → **Camouflage** → **Exclude This File**\n3. The file will no longer be processed by Camouflage\n\nTo include a file again:\n\n1. Open the excluded file\n2. Right-click → **Camouflage** → **Include This File**\n\n#### Using Settings\n\n```json\n// Exclude specific files from Camouflage\n\"camouflage.files.excludedFiles\": [\n  \"/path/to/public-config.json\",\n  \"examples/sample.env\",\n  \"test-fixtures/config.yaml\"\n]\n```\n\nThis is useful when you have configuration files that don't contain sensitive data and should always be visible.\n\n### Configuring Parsers\n\nYou can enable or disable specific parsers based on your needs:\n\n```json\n// Enable only specific parsers\n\"camouflage.files.enabledParsers\": [\"env\", \"json\", \"yaml\"]\n\n// Configure nested key depth for JSON/YAML\n\"camouflage.parserOptions.maxNestedDepth\": 10\n```\n\n## Security\n\n### Visual Protection Only\n\nCamouflage only hides values visually in the editor. The actual file content remains unchanged. Always be cautious when sharing your screen or taking screenshots.\n\n### Reporting Security Issues\n\nIf you discover a security vulnerability, please follow our [security policy](SECURITY.md) for responsible disclosure.\n\n## Contributing\n\nThis extension is open source and available on [GitHub](https://github.com/zeybek/camouflage). Contributions are welcome!\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run tests with `npm test`\n5. Ensure code passes linting with `npm run lint`\n6. Submit a pull request\n\nPlease see our [contributing guidelines](CONTRIBUTING.md) for more details.\n\n## License\n\nThis extension is released under the [MIT License](LICENSE).\n\n## Support\n\nIf you encounter any issues or have suggestions:\n\n- File an issue on [GitHub](https://github.com/zeybek/camouflage/issues)\n- Contact: [Ahmet Zeybek](https://github.com/zeybek)\n\n## Changelog\n\nSee the [CHANGELOG.md](CHANGELOG.md) file for details on each release.\n\n---\n\n**Enjoy hiding your sensitive configuration values with Camouflage!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeybek%2Fcamouflage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzeybek%2Fcamouflage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeybek%2Fcamouflage/lists"}