The unified command-line tool for freelancers
Work across multiple projects with a single, beautiful interface for PRs, tickets, and more.
Installation β’ Quick Start β’ Features β’ Documentation
One CLI is designed for freelancers and consultants who juggle multiple clients and projects. Instead of remembering different workflows, credentials, and commands for each project, One provides a unified interface that adapts to your current project automatically.
# Project A (Client 1) - GitHub + Jira
cd ~/client1/project-a
git checkout -b PROJ-123-feature
# ... make changes ...
git push origin PROJ-123-feature
# Open browser, create PR manually, copy ticket link...
# Project B (Client 2) - GitLab + Linear
cd ~/client2/project-b
git checkout -b LIN-456-feature
# ... different workflow ...
# Different credentials, different browser profile...# Any project, anywhere
cd ~/any/project
one start PROJ-123 # Automatically: checkout, pull, create branch
# ... make changes ...
one pr # Automatically: push, create PR, open in browserOne CLI automatically detects your project, uses the right credentials, opens the correct browser profile, and creates PRs in the right format.
|
|
|
|
$ one init
β Detected Git remote: github (acme-corp/main-app)
ββ Project Name βββββββββββββββββββββββββββββ
β Acme Corp β
βββββββββββββββββββββββββββββββββββββββββββββ
ββ Git Provider βββββββββββββββββββββββββββββ
β > GitHub (Detected: github) β
β GitLab β
β Bitbucket β
βββββββββββββββββββββββββββββββββββββββββββββ
β Configuration saved successfully!
π Starting GitHub authentication...
Please visit: https://github.com/login/device
And enter code: ABCD-1234
Waiting for authorization......
β Successfully authenticated with GitHub!$ one start PROJ-1234
Starting new task...
Project: Acme Corp
β Checked out main
β Pulled from origin/main
β Fetching ticket info...
β Created branch PROJ-1234-add-user-authentication
β Ready to work on PROJ-1234-add-user-authentication!
When done, run: one pr$ one pr
Creating pull request...
Project: Acme Corp
Branch: PROJ-1234-add-authentication
Ticket ID: PROJ-1234
β Pushed to origin
β PR created: https://github.com/acme/app/pull/123
β‘ Running after_pr hooks...
[1/1] Notify team
β Success (0.3s)
Opening in browser (Work Profile - john@acme.com)...
Done! πEverything automated: Git detection, OAuth, hooks, browser profiles!
go install github.com/yourusername/one@latestgit clone https://github.com/yourusername/one.git
cd one
make build
sudo make installbrew install one-clicd /path/to/your/projectone initThis interactive wizard will:
- β Auto-detect your Git remote (GitHub/GitLab/Bitbucket)
- β Pre-fill owner and repository from remote URL
- β Detect your default branch (main/master/develop)
- β Authenticate with GitHub via OAuth (optional)
- β Configure browser profiles for work/personal separation
- β Set up ticket system integration (Jira/Linear)
# Start a new task
one start PROJ-1234
# Make your changes
git add .
git commit -m "Add feature"
# Create a PR (push + create + open in browser)
one prThat's it! One CLI handles the rest. π
| Command | Description |
|---|---|
one init |
Interactive setup with Git auto-detection |
one start <ticket-id> |
Start working on a task (checkout, pull, create branch) |
one pr |
Create and open a pull request |
one ticket <ticket-id> |
Open ticket in browser |
one config list |
List all configured projects |
one config show |
Show current project config |
one profiles |
List browser profiles with emails |
one help |
Beautiful formatted help |
one docs |
View documentation |
- Quick Start Guide - Get started in 5 minutes
- Features - Complete feature list with examples
- Implementation - Technical deep dive
- Specification - Complete technical specification
One CLI uses YAML configuration files stored in ~/.config/one/projects/.
version: 1
project:
name: "Acme Corp"
paths:
- "/Users/john/Projects/acme-app"
git:
provider: github
remote: origin
base_branch: main
github:
owner: acme-corp
repo: main-app
token_env: GITHUB_TOKEN
browser:
type: chrome
profile: "Work Profile" # Keep work and personal separate!
ticket:
system: jira
base_url: https://acme.atlassian.net
jira:
board_id: ACME
templates:
pr_title: "[{ticket_id}] {branch_name}"
pr_body: |
## Changes
-
## Ticket
{ticket_url}
branch_patterns:
ticket_id: "^([A-Z]+-\\d+)"
# Hooks: Run commands before/after PR creation
hooks:
before_pr:
- name: "Lint code"
command: "bundle exec rubocop"
fail_on_error: true # Stop if lint fails
- name: "Run tests"
command: "bundle exec rspec"
fail_on_error: true # Stop if tests fail
after_pr:
- name: "Notify team"
command: 'curl -X POST $SLACK_WEBHOOK -d "{\"text\":\"PR created!\"}"'
fail_on_error: false # Continue even if notification failsSee examples/ for more configurations and HOOKS.md for complete hooks documentation.
- Multiple Clients: Different projects, different providers, one workflow
- Context Switching: Automatic project detection, no mental overhead
- Professional: Browser profiles keep work separate from personal
- Secure: OS keyring integration, never store tokens in plaintext
- Onboarding: New team members set up in minutes with
one init - Consistency: Everyone uses the same workflow across projects
- Standards: Enforce PR templates and branch naming conventions
- Flexibility: Each project can have its own configuration
Built with the Charm ecosystem:
- Huh - Beautiful interactive forms
- Bubble Tea - Terminal UI framework
- Glamour - Markdown rendering
- Lipgloss - Terminal styling
Plus:
- Cobra - CLI framework
- go-git - Pure Go git implementation
- go-keyring - Cross-platform keyring
One CLI is smart about your environment:
- Git Remote: Detects GitHub/GitLab/Bitbucket from
git remote - Owner & Repo: Parses SSH and HTTPS remote URLs
- Default Branch: Detects main/master/develop
- Project Path: Uses current directory automatically
Secure authentication without copying tokens:
$ one init
# ... configuration ...
ββ Authenticate with GitHub now? ββββββββββββ
β > Yes, authenticate β
β Skip for now β
βββββββββββββββββββββββββββββββββββββββββββββ
π Starting GitHub authentication...
Please visit: https://github.com/login/device
And enter code: ABCD-1234
Waiting for authorization......
β Successfully authenticated with GitHub!Your token is securely stored in:
- macOS: Keychain
- Linux: Secret Service (gnome-keyring/kwallet)
- Windows: Credential Manager
Keep work and personal browsing separate:
browser:
type: chrome
profile: "Work Profile"One CLI opens PRs in your work browser profile with your work Google account logged in. No more confusion!
Customize PR titles and descriptions per project:
templates:
pr_title: "[{ticket_id}] {branch_name}"
pr_body: |
## π Summary
## π Related
- Ticket: {ticket_url}
- Branch: {branch_name}
- Author: {author}
## β
Checklist
- [ ] Tests added
- [ ] Docs updatedAvailable variables:
{ticket_id}- Extracted from branch name{branch_name}- Current branch{ticket_url}- Generated ticket URL{author}- Git user name{email}- Git user email{date}- ISO 8601 date
# Client A - GitHub + Jira
cd ~/clients/acme
one start ACME-123 # Uses Acme config automatically
# Client B - GitLab + Linear
cd ~/clients/beta
one start BET-456 # Uses Beta config automatically
# Personal Project - GitHub
cd ~/personal/side-project
one start FEAT-789 # Uses personal config automatically# Morning: Enterprise client (strict PR template)
cd ~/work/enterprise
one start ENT-1001
one pr # Opens in work Chrome profile
# Afternoon: Startup client (simple workflow)
cd ~/work/startup
one start DEV-42
one pr # Opens in different Chrome profile
# Evening: Open source (personal)
cd ~/oss/project
one start ISS-99
one pr # Opens in personal browser| Feature | One CLI | Manual Workflow | Other Tools |
|---|---|---|---|
| Multi-project support | β Automatic | β Manual | |
| Auto-detection | β Git remote | β None | β None |
| GitHub OAuth | β Device flow | β Manual tokens | β Manual |
| Browser profiles | β Yes | β Manual | β No |
| Ticket integration | β Multiple systems | β Manual | |
| Cross-platform | β Full | β Yes | |
| Secure storage | β OS keyring | β Plaintext | |
| Setup time | β < 2 minutes | β Per project |
Do I need to configure each project manually?
No! Run one init in your project directory and it will:
- Auto-detect your Git provider from the remote URL
- Pre-fill owner and repository information
- Detect your default branch
- Optionally authenticate via OAuth
You just confirm the detected values.
How does One CLI know which project I'm working on?
One CLI checks your current working directory against configured project paths. It uses prefix matching, so any subdirectory of a configured project will work.
cd ~/projects/acme/src/api # Matches ~/projects/acme
one pr # Uses Acme config automaticallyIs it safe to store credentials?
Yes! One CLI uses your operating system's native secure storage:
- macOS: Keychain Services
- Linux: Secret Service (gnome-keyring/kwallet)
- Windows: Credential Manager
Credentials are never stored in plaintext files. You can also use environment variables as a fallback.
Can I use it with self-hosted Git servers?
Yes! One CLI supports:
- GitHub Enterprise
- Self-hosted GitLab instances
- Bitbucket Server
Just specify the base URL in your configuration.
Does it work with my ticket system?
One CLI supports:
- Jira Cloud (with API integration)
- Linear (URL generation)
- GitHub Issues (URL generation)
More integrations coming soon! Or use custom ticket URLs.
- OAuth flows for GitLab and Bitbucket
- Browser profile auto-detection
- Shell completions (bash/zsh/fish)
- Draft PR support
- Linear API integration (not just URLs)
- Azure DevOps support
- PR review commands
- Multi-repo operations
- GitHub App instead of OAuth app
- Team features (shared configs)
Contributions are welcome! Whether it's:
- π Bug reports
- π‘ Feature requests
- π Documentation improvements
- π§ Code contributions
Please see CONTRIBUTING.md for guidelines.
MIT License - see LICENSE for details.
Built with the amazing Charm ecosystem:
- Huh - Interactive forms
- Bubble Tea - TUI framework
- Glamour - Markdown rendering
- Lipgloss - Styling
Made with β€οΈ for freelancers and consultants
β Star on GitHub β’ π Report Bug β’ π‘ Request Feature