{"id":51444074,"url":"https://github.com/haydenk/workbench","last_synced_at":"2026-07-05T14:04:43.598Z","repository":{"id":351795202,"uuid":"1212193889","full_name":"haydenk/workbench","owner":"haydenk","description":"Codespaces-first Ubuntu devcontainer for terminal, scripting, and DevOps work — ships with dotfiles bootstrap, Docker, Tailscale, and `ghrepo` for fuzzy GitHub repo cloning.","archived":false,"fork":false,"pushed_at":"2026-05-30T19:04:56.000Z","size":2070,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-30T20:15:27.452Z","etag":null,"topics":["cli","codespaces","devcontainer","devops","docker","dotfiles","fish","fzf","github-cli","github-codespaces","mise","shell","tailscale","terminal","ubuntu","zsh"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haydenk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"github":["haydenk"]}},"created_at":"2026-04-16T06:36:29.000Z","updated_at":"2026-05-30T19:04:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/haydenk/workbench","commit_stats":null,"previous_names":["haydenk/workbench"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/haydenk/workbench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haydenk%2Fworkbench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haydenk%2Fworkbench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haydenk%2Fworkbench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haydenk%2Fworkbench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haydenk","download_url":"https://codeload.github.com/haydenk/workbench/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haydenk%2Fworkbench/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35156671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","codespaces","devcontainer","devops","docker","dotfiles","fish","fzf","github-cli","github-codespaces","mise","shell","tailscale","terminal","ubuntu","zsh"],"created_at":"2026-07-05T14:04:43.070Z","updated_at":"2026-07-05T14:04:43.588Z","avatar_url":"https://github.com/haydenk.png","language":"Shell","funding_links":["https://github.com/sponsors/haydenk"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"workbench-preview.png\" alt=\"workbench preview\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://codespaces.new/haydenk/workbench?quickstart=1\"\u003e\n    \u003cimg src=\"https://github.com/codespaces/badge.svg\" alt=\"Open in GitHub Codespaces\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nA GitHub Codespaces devcontainer for general-purpose terminal, scripting, and DevOps work. Opens a fully configured Linux environment with your dotfiles, `gh` CLI, Docker, and Tailscale — ready in seconds.\n\n\u003e [!NOTE]\n\u003e Designed and tested specifically for **GitHub Codespaces**. While the devcontainer spec is technically portable, features like dotfiles integration, Codespaces secrets (`GH_PAT`), and host requirements are Codespaces-specific and won't work as expected in other devcontainer environments (e.g. local VS Code Dev Containers).\n\n## Getting started\n\n1. Click the *Open in GitHub Codespaces* badge (or create one manually from this repo)\n2. Codespaces installs your dotfiles automatically\n3. `post-create.sh` installs `fish`, wires up the `ghrepo` shell function, and writes `~/.zshenv` so zsh reads its config from `~/.config/zsh/` (skipped if your dotfiles already set `ZDOTDIR`)\n4. `post-attach` prints a short next-steps hint in your terminal\n\nConfigure once in your GitHub settings:\n\n- **Dotfiles**: [github.com/settings/codespaces](https://github.com/settings/codespaces) → set your dotfiles repo\n- **Secrets**: set `GH_PAT` (personal PAT) and optionally org-specific secrets to enable `ghrepo` — see [docs/secrets.md](docs/secrets.md)\n\n## Documentation\n\n| Topic | Doc |\n|---|---|\n| Generating PATs and storing Codespaces secrets | [docs/secrets.md](docs/secrets.md) |\n| `ghrepo` — fuzzy-search and clone any repo | [docs/ghrepo.md](docs/ghrepo.md) |\n| Prebuilds, machine size, idle/retention, Dependabot auto-merge | [docs/codespaces.md](docs/codespaces.md) |\n| Using this Codespace from iPadOS (Safari PWA, Echo, Tailscale) | [docs/ipad.md](docs/ipad.md) |\n| Where to put what tool — `mise` recipes for runtimes, AI CLIs, cloud CLIs | [docs/mise.md](docs/mise.md) |\n\n## What's included\n\n### Base image\n\n`mcr.microsoft.com/devcontainers/base:ubuntu-24.04` — minimal Ubuntu 24.04 LTS with no pre-installed runtimes. Everything else is added via features, mise, or dotfiles.\n\n### Added by devcontainer features\n\n| Tool | Purpose |\n|---|---|\n| common-utils | Sets zsh as default shell |\n| github-cli | `gh` CLI |\n| git-lfs | Large file support |\n| docker-outside-of-docker | Docker socket wiring for compose and builds |\n| tailscale | Installs `tailscale`/`tailscaled`; auto-joins your tailnet when the `TAILSCALE_AUTHKEY` Codespaces secret is set |\n\n\u003e [!TIP]\n\u003e Runtimes and cloud CLIs (kubectl, helm, AWS, gcloud, Azure, etc.) are not pre-installed. Add them via mise when needed — e.g. `mise use -g aqua:aws-cli` or add to a repo's `mise.toml`.\n\n### Installed by `post-create.sh`\n\n| Tool | Purpose |\n|---|---|\n| `fish` | Friendly shell — apt-installed |\n| `ripgrep` | Apt-installed at `/usr/bin/rg` so the Todo Tree extension finds it; dotfiles may shadow this with a newer version |\n| `ghrepo` | Fuzzy-search GitHub repos and clone — see [docs/ghrepo.md](docs/ghrepo.md) |\n| `ghrepo-core` | POSIX-sh helper both shell wrappers call into for the `gh` + `jq` + `git` plumbing |\n| `~/.zshenv` | Sets `ZDOTDIR=~/.config/zsh` so zsh reads its config from XDG (skipped if your dotfiles already set it) |\n\n### Added by dotfiles (`dotfiles_bootstrap`)\n\nThese come from the maintainer's personal dotfiles repo, not this repo — a fork using different dotfiles will get whatever those provide instead. Listed here for context.\n\n| Tool | Purpose |\n|---|---|\n| Oh My Zsh + plugins | Shell framework with autosuggestions, syntax highlighting |\n| eza | Modern `ls` replacement |\n| bat | `cat` with syntax highlighting |\n| fd | Fast `find` replacement |\n| ripgrep | Fast `grep` replacement |\n| fzf | Fuzzy finder |\n| git-delta | Better git diffs |\n| mise | Runtime version manager |\n| qsv | CSV toolkit |\n| Claude CLI | Anthropic's Claude in the terminal |\n\n\u003e [!NOTE]\n\u003e Dotfiles may also install `ripgrep`; the workbench's apt-installed `/usr/bin/rg` is what the Todo Tree extension binds to, while a dotfiles-installed `rg` (typically at `~/.local/bin/rg` or similar) takes PATH precedence in interactive shells.\n\n### Shell configuration\n\nYour dotfiles provide:\n\n- **zsh** with Oh My Zsh, custom theme pool, autosuggestions, syntax highlighting\n- **fish** with fzf integration, mise activation\n- Aliases for `ls/eza`, `cat/bat`, `fd`, `ripgrep`, git shortcuts, docker, kubectl\n- fzf functions: `fe` (fuzzy edit), `fzp` (fuzzy preview), `rge` (ripgrep → editor), `rgf` (ripgrep → fzf)\n\n### Project-level tools\n\nRepos cloned into this workspace bring their own `mise.toml`. Run `mise install` inside any repo to get its required runtimes and tools (terraform, rust, specific node/python versions, etc.).\n\n## VS Code extensions\n\n| Extension | Purpose |\n|---|---|\n| bash-ide, shell-format, shellcheck, vscode-fish | Shell script editing + linting (bash, sh, fish) |\n| GitLens, git-graph, vscode-github-actions | Git history, blame, workflow editing |\n| vscode-yaml, even-better-toml, EditorConfig | Config file editing |\n| markdownlint | Markdown linting for the docs |\n| vscode-docker | Docker integration |\n| errorlens, path-intellisense, todo-tree | Editor productivity |\n| code-spell-checker | Catches typos (project word list in `.cspell.json`) |\n| Claude Code, GitHub Copilot | AI assistants |\n\n## Structure\n\n```\n.devcontainer/\n├── devcontainer.json       # container definition\n└── scripts/\n    ├── post-create.sh      # runs once on container creation\n    ├── post-start.sh       # runs on every container start\n    ├── ghrepo-core         # POSIX-sh plumbing for ghrepo (fetch + clone)\n    ├── ghrepo.zsh          # zsh wrapper around ghrepo-core\n    └── ghrepo.fish         # fish wrapper around ghrepo-core\n\n.github/\n├── FUNDING.yml             # Sponsor button config\n├── dependabot.yml          # weekly devcontainer feature updates\n└── workflows/\n    ├── ci.yml              # shellcheck + zsh/fish syntax + devcontainer smoke test\n    └── dependabot-auto-merge.yml  # patch/minor auto-merge\n\ndocs/\n├── secrets.md              # PATs + Codespaces secrets\n├── ghrepo.md               # ghrepo usage\n├── codespaces.md           # prebuilds, machine size, timeouts\n├── ipad.md                 # iPadOS workflow\n└── mise.md                 # mise recipes: where to put each tool\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaydenk%2Fworkbench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaydenk%2Fworkbench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaydenk%2Fworkbench/lists"}