{"id":51238728,"url":"https://github.com/raminr77/zero-day","last_synced_at":"2026-06-28T22:31:50.852Z","repository":{"id":367311197,"uuid":"1280240084","full_name":"raminr77/zero-day","owner":"raminr77","description":"One command to transform a fresh machine into your complete development environment.","archived":false,"fork":false,"pushed_at":"2026-06-25T12:39:38.000Z","size":60,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T13:21:49.596Z","etag":null,"topics":["bootstrap","dotfiles","initial","zero-dey"],"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/raminr77.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":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":"2026-06-25T11:53:46.000Z","updated_at":"2026-06-25T12:39:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/raminr77/zero-day","commit_stats":null,"previous_names":["raminr77/zero-day"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/raminr77/zero-day","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminr77%2Fzero-day","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminr77%2Fzero-day/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminr77%2Fzero-day/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminr77%2Fzero-day/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raminr77","download_url":"https://codeload.github.com/raminr77/zero-day/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raminr77%2Fzero-day/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34906700,"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-06-28T02:00:05.809Z","response_time":54,"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":["bootstrap","dotfiles","initial","zero-dey"],"created_at":"2026-06-28T22:31:50.763Z","updated_at":"2026-06-28T22:31:50.846Z","avatar_url":"https://github.com/raminr77.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# zero-day · one-command machine setup\n\n[![CI](https://github.com/raminr77/zero-day/actions/workflows/ci.yml/badge.svg)](https://github.com/raminr77/zero-day/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nProvision a fresh **Ubuntu/Debian server** or **macOS laptop** from nothing with\na single command: system update, all your tools, your shell, and your config files.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/raminr77/zero-day/main/install.sh | bash\n```\n\n\u003e [`install.sh`](install.sh)). The bootstrap installs `git`, clones this repo to\n\u003e `~/.zero-day`, then runs [`setup.sh`](setup.sh).\n\nThe script is **idempotent** — safe to run again any time to top up a machine.\n\n---\n\n## What it does\n\n| Module        | What it installs / configures                                                                    |\n| ------------- | ------------------------------------------------------------------------------------------------ |\n| `00-update`   | `apt update \u0026\u0026 upgrade` / Homebrew install + `brew upgrade`                                      |\n| `10-base`     | git, curl, wget, htop + modern CLI: bat, eza, fd, ripgrep, fzf, zoxide, jq, yq, tldr, btop, ncdu |\n| `20-zsh`      | zsh, oh-my-zsh, **Powerlevel10k**, and all your plugins                                          |\n| `30-node`     | Node.js (LTS), npm, pnpm + yarn (via corepack)                                                   |\n| `40-docker`   | Docker Engine + Compose (Linux) / Docker Desktop (macOS)                                         |\n| `50-extra`    | tmux, neovim, lazygit, lazydocker, direnv, mise                                                  |\n| `60-dotfiles` | symlinks `config/*` into `$HOME` (backs up existing files)                                       |\n| `70-git`      | git identity + sensible defaults                                                                 |\n| `75-ssh`      | **(Linux)** optionally authorise an SSH public key                                               |\n| `80-security` | **(Linux)** ufw firewall, fail2ban, unattended-upgrades                                          |\n\nOS is detected automatically; macOS skips the Linux-only modules.\n\n---\n\n## Configuration files (kept in the repo)\n\nYour real dotfiles live under [`config/`](config/) and are **symlinked** onto the\nmachine, so the repo is the single source of truth:\n\n```txt\nconfig/zsh/.zshrc        config/git/.gitconfig\nconfig/zsh/.p10k.zsh     config/tmux/.tmux.conf\nconfig/nvim/init.lua\n```\n\nEdit them in the repo, commit, and re-run `setup.sh` (or just `git pull` —\nthey're symlinks). Existing files are backed up to `*.bak.\u003ctimestamp\u003e`.\n\n---\n\n## Options\n\n```bash\n./setup.sh --yes              # assume yes (non-interactive)\n./setup.sh --only 20,30       # run only zsh + node modules\n./setup.sh --skip 40,80       # skip docker + security\n./setup.sh --dry-run          # show what would run\n```\n\n### Interactive by default — `.env` is optional\n\nYou don't need any config file. When run, `setup.sh` **asks for whatever it\nneeds** along the way (git name/email, whether to add an SSH key, etc.), and\nprompts work even under `curl | bash` because they read from your terminal.\n\nIf you'd rather run **fully unattended** (no prompts), drop the values into a\ngit-ignored `.env` (see [`.env.example`](.env.example)) or pass them inline:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/raminr77/zero-day/main/install.sh \\\n  | GIT_NAME=\"Ramin\" GIT_EMAIL=\"you@example.com\" bash\n```\n\n---\n\n## SSH key on a new server\n\n`75-ssh` asks whether to add an SSH public key. Paste the **public** key from\nyour laptop (`cat ~/.ssh/id_ed25519.pub`) and it's appended to\n`~/.ssh/authorized_keys` with correct permissions (deduplicated). Or set\n`SSH_PUBLIC_KEY` in `.env` to do it without a prompt.\n\n---\n\n## A note on version managers\n\nYou use both the `pyenv` zsh plugin and `mise`. **mise** is the primary version\nmanager here (Node, Python, etc. via `mise use -g node@lts`); the `pyenv` plugin\nstays enabled in `.zshrc` and activates only if `pyenv` is present. Pick whichever\nyou prefer per language — they don't conflict.\n\n`fast-syntax-highlighting` is enabled in `.zshrc` (not `zsh-syntax-highlighting`)\nsince the two conflict; both are cloned so you can switch by editing the plugin list.\n\n---\n\n## Development\n\n```bash\nmake lint     # shellcheck all scripts\nmake test     # run the bats suite\nmake dry-run  # preview without changes\n```\n\n### Testing safely in a container\n\n```bash\ndocker run -it --rm ubuntu:24.04 bash -c '\n  apt-get update \u0026\u0026 apt-get install -y curl \u0026\u0026\n  curl -fsSL https://raw.githubusercontent.com/raminr77/zero-day/main/install.sh | bash'\n```\n\n---\n\n## Layout\n\n```txt\ninstall.sh        bootstrap entrypoint (curl | bash)\nsetup.sh          orchestrator: sources libs, runs modules in order\nlib/ui.sh         pretty CLI: colours, banner, spinner, prompts\nlib/common.sh     OS detection, package helpers, linking, SSH keys\nmodules/          one file per step (NN-name.sh)\nconfig/           your dotfiles (symlink sources)\ntests/            bats unit tests for the pure helpers\n.github/          CI workflow (shellcheck + bats + integration)\n```\n\n---\n\n## License\n\n[MIT](LICENSE) © Ramin Rezaei\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framinr77%2Fzero-day","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framinr77%2Fzero-day","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framinr77%2Fzero-day/lists"}