{"id":29353614,"url":"https://github.com/jrbrowning/toolshed","last_synced_at":"2026-04-07T21:31:00.141Z","repository":{"id":303666430,"uuid":"1015667166","full_name":"jrbrowning/toolshed","owner":"jrbrowning","description":"Scripts used during daily development and when setting up a new MacBook Pro","archived":false,"fork":false,"pushed_at":"2025-09-03T22:29:02.000Z","size":65,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-30T08:58:19.434Z","etag":null,"topics":["bootstrap","dev-environment-setup","developer-tools","homebrew","macos","nodejs","python3","setup-scripts","zsh"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/jrbrowning.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":".github/CODEOWNERS","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-07-07T21:22:04.000Z","updated_at":"2025-09-03T22:29:00.000Z","dependencies_parsed_at":"2025-07-08T20:21:09.464Z","dependency_job_id":"01ce1cb8-0f54-4021-a730-2dd1bcf272f2","html_url":"https://github.com/jrbrowning/toolshed","commit_stats":null,"previous_names":["jrbrowning/toolshed"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jrbrowning/toolshed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jrbrowning%2Ftoolshed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jrbrowning%2Ftoolshed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jrbrowning%2Ftoolshed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jrbrowning%2Ftoolshed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jrbrowning","download_url":"https://codeload.github.com/jrbrowning/toolshed/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jrbrowning%2Ftoolshed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31530640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"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":["bootstrap","dev-environment-setup","developer-tools","homebrew","macos","nodejs","python3","setup-scripts","zsh"],"created_at":"2025-07-09T02:02:32.460Z","updated_at":"2026-04-07T21:31:00.135Z","avatar_url":"https://github.com/jrbrowning.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# toolshed\n\nAn opinionated developer productivity toolkit for macOS, focused on development environment setup, reproducibility, and automation.\n\nThis repo contains scripts and configuration files to bootstrap your environments, making it easy to set up a new laptop or keep your dev tools in sync.\n\n# Motivation\n\nI got a new laptop and wanted to start with a fresh env install. Then I realized, I really still want _a few things_ from my old setup.\n\nAlso, relying on the default versions of Python and Node on your machine can lead to a lot of dependency down the road. What happens when you (inevitably) need to update something and next thing your local tool starts giving \"not found\" errors? Ugh.\n\nMy solution was to create a toolshed and whenever I get a new laptop (or create a new iTerm session), I can source whichever ENV script I need (new laptop, Python or Node) and I'll always have a consistent starting point. Tool versions are defined as ENVs and config files for future upgrades, but the script always remains the same.\n\n# Features\n\n**Brewfile**: Portable Homebrew Configuration\n\nThis file defines my macOS toolchain setup:\n\n- 🔧 System tools (htop, jq, tree) for system inspection\n- 💻 Language environments (nvm, pyenv, rust, go) for dev stack\n- 🔄 Shell enhancements (fzf, ripgrep, bat, zsh-autosuggestions, oh-my-zsh) for speed and developer ergonomics\n- 🧪 Local databases (Postgres, Redis, SQLite) for backend development\n- ☁️ DevOps \u0026 Cloud (kubectl, terraform, supabase) for cloud integration\n- 🪟 UI utilities (iterm2, rectangle) for a UI setup\n- 📂 Cloud storage (Dropbox, GCP SDK) for syncing\n- 🤖 AI tools (ChatGPT, Claude) for local desktop integration\n- 📌 Using this file ensures full parity across machines with a single commands:\n\n## 🚀 Usage Summary\n\nThis toolkit supports two primary workflows:\n\n[🆕 New Laptop Setup](#new-laptop-setup)\n\n- One-command bootstrap for Homebrew, CLI tools, and Zsh plugins\n- Restore or sync packages using a generated Brewfile\n\n[🛠️ Daily Environment Consistency](#daily-use-setup)\n\n- Setup Python with pyenv and install global tools\n- Setup Node.js via nvm and install global npm packages\n- Free up space from Docker usage (esp. for local AI dev)\n\n## New laptop Setup\n\nGot a new Laptop? As your machine won't have any base tools (homebrew, git, etc), this is where I begin. This script ensures a **repeatable, fast, and minimal-hassle** setup for macOS machines:\n\n- **Consistency** – Using a Brewfile and plugin list guarantees you get the same dev environment every time.\n- **Speed** – No need to remember dozens of CLI tools, databases, or apps — it's all here.\n- **Zsh-first Shell Setup** – Syntax highlighting and autosuggestions are configured out of the box for productivity.\n- **NVM + Node** – Maintain Node versions consistently across machines and teams.\n- **Idempotent** – Homebrew’s bundle install won’t reinstall anything unnecessarily.\n- **Extendable** – Add or remove tools in one place. Easy to version control.\n\n### Homebrew, Git, Zsch, NMV install\n\n0. Clone this repository on your existing machine.\n\n```bash\ngit clone git@github.com:jrbrowning/toolshed.git\n```\n\n1. Copy the `new-laptop-setup` folder to any folder to your `iCloud Drive`. This will be accessible on your new machine\n\n```bash\ncp -R new-laptop-setup ~/Library/Mobile\\ Documents/com~apple~CloudDocs/\n```\n\n2. Run the script.\n\n- Install Homebrew, packages in the Brewfile, and Zsh\n\n```bash\ncd new-laptop-setup\npython3 setup.py\n```\n\n3. (optional): Added some new packages in your Brewfile and want to \"sync\" again?\n\n- Export or restore Homebrew packages\n\n```bash\npython3 brew_sync.py\n```\n\n## Daily use Setup\n\nNow that the machine is setup with the base tools, we can clone the repo anytime we need access to the toolshed.\n\n### Clone the toolshed Repo\n\nIn another repo I want to have access to the toolshed (I add this to every repo I work with), add the toolshed as a folder (NOT a subrepo)\n\n```bash\ncd \u003cwhatever repo you want to add the toolshed too\u003e\ngit clone git@github.com:jrbrowning/toolshed.git\n```\n\nNow add `toolshed` to your .gitignore file\n\n```bash\necho -e \"\\n# toolshed - developer tool repo\\ntoolshed/\" \u003e\u003e .gitignore\n```\n\nYou are ready to go! The following configurations are avaialble.\n\n### Python\n\nWhy not just install globally?   Sure, you absolutely can.   My background at an agency lead me to having to install many different versions of node, python, php, etc.. to match whatever client needs where.   This kind of need quickly overwhelms the idea of \"global\" anything.   You will find yourself in dependency hell before you know it.   \n\nSo this is my (highly opinionated) solution\n\nOpt1:  Create a Virtual ENV with useful packages.   Can source anywhere.\n```setup_python...``` \n\nInstalls Python, creates venv, installs global tools\n(why `source` first? When you source the file, you'll enter the newly created env. Otherwise, you'll just build it)\n\n```bash\ncd toolshed;\nsource setup_python_env.sh\n```\n(To exit out of a venv, type `deactivate`)\n\nOpt2:  Create a Virtual ENV from your pyproject.toml.  Install using poetry.  \n```setup_poetry...```\n\nInstalls Python, creates venv, installs global tools via pyproject.toml.\n\n(why `source` first? When you source the file, you'll enter the newly created env. Otherwise, you'll just build it)\n\n```bash\ncp setup_poetry_env.sh into a bin directory in your repo.   I like it at \u003cproject root\u003e /bin\n```\nthen you can source the file from whereven your pyproject.toml is\n```bash\ncd \u003cdirectory with pyproject.toml\u003e\nsource ../bin/setup_poetry_env.sh\n```\n(To exit out of a venv, type `deactivate`)\n\n### Node.js\n\nInstalls Node via NVM and global npm tools defined in [`node-tools`](global-tools/node-tools.json)\n\n```bash\ncd toolshed;\nsource setup-node-env.sh\n```\n\n## Clean up scripts\n\n### Python Cache\n\nShort defensive script to remove cache files from parent recurrsively\nWhen you just want to confirm it's not a cache thing, destroy it all and start over.\nCall from directory you want to recurrsively remove all cache files from \n\n```bash\nsource ../toolshed/py_clean_cache.sh\n```\n\n### Docker Cleanup\n\n- Aggressively remove all Docker containers, images, volumes, networks, and caches. As the name implies, this is the \"I want to start over... everything must go\". USE WITH CAUTION!\n- Script: [`clean_scripts/destroy-everything.sh`](clean_scripts/destroy-everything.sh)\n\n---\n\n## Directory Structure\n\n```\ntoolshed/\n├── setup_python_env.sh        ## setup basic pyenv \n├── setup-node-env.sh          ## setup basic node env\n├── setup_poetry_env.sh        ## setup env based on poetry file \n└── .gitignore\n├── global-tools/\n│   ├── node-tools.json        ## This is a JSON format for installing any the setup-node-env npm tools you.\n│   └── requirements.txt       ## This is where you add the setup_python_env ENV specific tools you want.\n├── new-laptop-setup/\n│   ├── Brewfile\n│   ├── brew_sync.py\n│   └── setup.py\n├── cleanup_scripts/\n│   |── py_clean_cache.py.     ## Recursively remove all py_cache files\n│   └── destroy-everything.sh. ## Read disclaimer first at the top of the script before using.   It does what the name implies.   It's for when you want to REALLY start over with your local docker.\n```\n\n---\n\n# Contributing\n\nAll changes must come through pull requests (only owner can push to branches)\n\n- Fork the repository and submit your changes via a pull request.\n- All PRs will be reviewed manually.\n- No direct pushes, branch deletions, or force pushes are allowed.\n\nThank you for contributing!\n\n---\n\n## Disclaimer\n\nThis project is provided as is under the MIT License. While every effort has been made to ensure these scripts are safe and effective, the author assumes no responsibility for errors, omissions, or changes in tool behavior due to upstream updates or compromised internet sources. Use at your own discretion — but realistically, I used this to set up my machine and use it daily.\n\n---\n\n## Keywords\n\nmacOS developer setup, zsh config, bootstrap script, homebrew setup, pyenv, nvm, dev machine automation, dotfiles, CLI tools, node global packages\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjrbrowning%2Ftoolshed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjrbrowning%2Ftoolshed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjrbrowning%2Ftoolshed/lists"}