{"id":34955722,"url":"https://github.com/alceal/pj","last_synced_at":"2026-03-17T15:31:10.836Z","repository":{"id":330621904,"uuid":"1123394926","full_name":"alceal/pj","owner":"alceal","description":"Project launcher CLI with fuzzy matching","archived":false,"fork":false,"pushed_at":"2026-03-08T13:09:06.000Z","size":121,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-08T14:51:14.061Z","etag":null,"topics":["cli","fuzzy-finder","productivity","rust","terminal"],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/alceal.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","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-12-26T19:29:16.000Z","updated_at":"2026-03-08T13:09:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alceal/pj","commit_stats":null,"previous_names":["alceal/pj"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/alceal/pj","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alceal%2Fpj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alceal%2Fpj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alceal%2Fpj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alceal%2Fpj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alceal","download_url":"https://codeload.github.com/alceal/pj/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alceal%2Fpj/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30517821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-14T19:51:21.629Z","status":"ssl_error","status_checked_at":"2026-03-14T19:51:12.959Z","response_time":57,"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":["cli","fuzzy-finder","productivity","rust","terminal"],"created_at":"2025-12-26T22:01:35.916Z","updated_at":"2026-03-17T15:31:10.824Z","avatar_url":"https://github.com/alceal.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pj\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://crates.io/crates/pj-cli\"\u003e\n    \u003cimg alt=\"Crates.io\" src=\"https://img.shields.io/crates/v/pj-cli.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/alceal/pj/blob/main/LICENSE.txt\"\u003e\n    \u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-MIT-blue.svg\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nA fast, terminal-based project launcher with fuzzy matching. Quickly navigate\nbetween projects, organize them with tags, and launch your editor with a single\ncommand.\n\n## Features\n\n- **Fuzzy Matching**: Interactive TUI with real-time filtering powered by skim\n- **Frecency Ranking**: Smart ordering based on frequency and recency of access\n- **Hierarchical Tags**: Organize projects with nested tags (e.g., `work/backend`)\n- **Shell Integration**: Automatic directory changing for bash, zsh, fish, and sh\n- **Editor Integration**: Launch your preferred editor when selecting a project\n- **Multiplexer Support**: Automatically opens vim/nvim in a split pane when running inside tmux or cmux\n- **Git Integration**: Prompt to initialize git repositories when adding projects\n- **GitHub Integration**: Optionally create GitHub remotes via the gh CLI\n\n## Installation\n\n### Homebrew\n\n```bash\nbrew install alceal/tap/pj\n```\n\n### Cargo\n\n```bash\ncargo install pj-cli\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/alceal/pj\ncd pj\ncargo install --path .\n```\n\n## Quick Start\n\nRun the interactive setup wizard:\n\n```bash\npj --init\n```\n\nThis will configure your shell, editor, and preferences. The wizard detects\nyour shell automatically and installs the necessary shell function for\ndirectory changing.\n\nAdd your first project:\n\n```bash\ncd ~/projects/my-app\npj -a -t work,rust\n```\n\nSelect and open a project:\n\n```bash\npj\n```\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `pj` | Open interactive project selector |\n| `pj \u003cfilter\u003e` | Filter projects by terms (auto-selects if single match) |\n| `pj --init` | Run the setup wizard |\n| `pj --config` | Interactive configuration editor |\n| `pj --list` | Display all tracked projects with status |\n| `pj -a` / `pj --add` | Add current directory as a project |\n| `pj --rm` | Remove projects interactively |\n| `pj --rm-missing` | Remove all projects with missing paths |\n\n### Options\n\n| Option | Description |\n|--------|-------------|\n| `-t, --tags \u003cTAGS\u003e` | Add tags to project(s) or filter when adding |\n| `--rm-tags \u003cTAGS\u003e` | Remove tags from project(s) |\n| `-e, --editor \u003cEDITOR\u003e` | Override the configured editor |\n| `--no-editor` | Skip opening editor (just cd if enabled) |\n| `--cd` / `--no-cd` | Override directory change behavior |\n\n### Examples\n\n```bash\n# Add project with multiple tags\npj -a -t work/backend,rust,api\n\n# Filter projects by name (auto-selects if single match)\npj rust\npj my-project\n\n# Open project with a different editor\npj -e zed\n\n# List all tracked projects\npj --list\n\n# Remove all projects with missing paths\npj --rm-missing\n\n# Edit configuration interactively\npj --config\n```\n\n## Configuration\n\nConfiguration is stored in `~/.pj/config.toml`:\n\n```toml\neditor = \"code\"           # Editor command to launch\ncd_on_select = true       # Change directory when selecting a project\ngit_init_on_add = true    # Prompt to initialize git when adding a project\ngh_create_on_add = false  # Create GitHub remote when adding (requires gh CLI)\n```\n\nProject data is stored in `~/.pj/projects.json`.\n\n## Shell Integration\n\nWhen `cd_on_select` is enabled, pj installs a shell function that wraps the\nbinary to enable directory changing. The setup wizard handles this\nautomatically for:\n\n- **Bash**: Added to `~/.bashrc`\n- **Zsh**: Added to `~/.zshrc`\n- **Fish**: Added to `~/.config/fish/config.fish`\n- **POSIX sh**: Added to `~/.profile`\n\n## Tag Hierarchy\n\nTags support hierarchical organization using `/` as a separator:\n\n```bash\n# Add with hierarchical tags\npj -a -t work/frontend/dashboard\n\n# Filter by tag in selection\npj work           # Fuzzy matches against path and tags\npj work/frontend  # More specific filter\n```\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE.txt file for\ndetails.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falceal%2Fpj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falceal%2Fpj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falceal%2Fpj/lists"}