{"id":51186581,"url":"https://github.com/tabsp/dotfiles","last_synced_at":"2026-06-27T11:00:35.794Z","repository":{"id":40438201,"uuid":"356226023","full_name":"tabsp/dotfiles","owner":"tabsp","description":"Personal macOS/Linux dotfiles with a tiny Rust-based deployer, bootstrap workflow, and terminal-first development setup.","archived":false,"fork":false,"pushed_at":"2026-06-27T09:43:52.000Z","size":1208,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-27T10:20:05.604Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://dotfiles.tabsp.com","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/tabsp.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":"2021-04-09T10:10:35.000Z","updated_at":"2026-06-27T09:43:56.000Z","dependencies_parsed_at":"2023-01-31T19:31:30.891Z","dependency_job_id":"96e74faa-3887-47bd-8404-7cdeeb1bf2d1","html_url":"https://github.com/tabsp/dotfiles","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tabsp/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tabsp%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tabsp%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tabsp%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tabsp%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tabsp","download_url":"https://codeload.github.com/tabsp/dotfiles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tabsp%2Fdotfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34850575,"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-27T02:00:06.362Z","response_time":126,"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":[],"created_at":"2026-06-27T11:00:35.212Z","updated_at":"2026-06-27T11:00:35.786Z","avatar_url":"https://github.com/tabsp.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dotfiles\n\n[中文](README.zh-CN.md)\n\ndotman is a tiny Rust-based dotfiles deployer for my personal macOS/Linux environment.\nIt uses a Dotbot-like ordered YAML config to link files, create directories, and run setup commands.\n\n## Preview\n\n![Terminal setup preview](assets/screenshots/terminal-preview.png)\n\n## Prerequisites\n\n- curl\n- fish shell\n- `dotman` installed in `~/.local/bin`\n\nFor first-time setup, install `dotman` and the published dotfiles bundle from\nthe site:\n\n```sh\ncurl -fsSL https://dotfiles.tabsp.com/install.sh | sh\n```\n\nWhen `dotman.yaml` is not present in the current directory, `dotman` falls back\nto `DOTFILES_DIR` and then to the installed bundle in\n`~/.local/share/tabsp-dotfiles`.\n\n## Usage\n\nPreview the deployment:\n\n```sh\ndotman deploy --dry-run\n```\n\nDeploy dotfiles:\n\n```sh\ndotman deploy\n```\n\nPreview bootstrap steps:\n\n```sh\ndotman bootstrap --dry-run\n```\n\nRun bootstrap steps:\n\n```sh\ndotman bootstrap\n```\n\nSkip shell commands such as plugin sync:\n\n```sh\ndotman deploy --except shell\n```\n\nRun only link steps:\n\n```sh\ndotman deploy --only link\n```\n\n## Tools\n\n| Tool | Purpose |\n|------|---------|\n| [fish](https://fishshell.com) | Shell with built-in autosuggestions |\n| [starship](https://starship.rs) | Cross-shell prompt |\n| [direnv](https://direnv.net) | Per-directory environment variables |\n| [mise](https://mise.jdx.dev) | Runtime and tool version manager |\n| [fzf](https://github.com/junegunn/fzf) | Fuzzy finder (files, history, zoxide jump) |\n| [zoxide](https://github.com/ajeetdsouza/zoxide) | Smarter `cd` with directory ranking |\n| [fd](https://github.com/sharkdp/fd) | Fast `find` replacement |\n| [ripgrep](https://github.com/BurntSushi/ripgrep) | Fast `grep` replacement |\n| [eza](https://github.com/eza-community/eza) | Modern `ls` replacement with icons |\n| [bat](https://github.com/sharkdp/bat) | `cat` with syntax highlighting |\n| [tealdeer](https://github.com/dbrgn/tealdeer) | Fast `tldr` client |\n| [btop](https://github.com/aristocratos/btop) | Resource monitor |\n| [fastfetch](https://github.com/fastfetch-cli/fastfetch) | System info display |\n| [dua-cli](https://github.com/Byron/dua-cli) | Disk usage analyzer |\n| [neovim](https://neovim.io) | Editor |\n| [lazygit](https://github.com/jesseduffield/lazygit) | Terminal Git UI |\n| [yazi](https://github.com/sachinsenal/yazi) | Terminal file manager |\n| [tmux](https://github.com/tmux/tmux) | Terminal multiplexer with Catppuccin theme |\n| [ghostty](https://ghostty.org) | GPU-accelerated terminal with Catppuccin Mocha theme |\n| [jq](https://github.com/jqlang/jq) + [yq](https://github.com/mikefarah/yq) | JSON/YAML CLI processors |\n| [ruby](https://www.ruby-lang.org) | Runtime for `try` experiment manager |\n\nAll packages are installed via `brew bundle --file packages/Brewfile` during bootstrap. Fish integrates most tools on startup and defines custom functions: `zi` (fzf+zoxide jump), `ff` (fzf file picker), `y` (yazi with auto-cd), `t` (tmux attach/create). See `config/fish/config.fish`.\n\n## Layout\n\n- `bin/`: user scripts linked into `~/.local/bin` (tmux-status, etc.)\n- `config/`: tracked dotfiles for fish, nvim, ghostty, btop, fastfetch, starship, tealdeer, tmux, git\n- `docs/`: setup notes and manual checklists\n- `dotman.yaml`: deploy steps (link configs, create directories, sync derived state)\n- `dotman.bootstrap.yaml`: bootstrap steps (install packages, fonts)\n- `packages/`: Brewfile and platform-specific install helpers\n- `scripts/`: install and static site build scripts\n- `src/`: Rust deployer source\n- `tests/`: CLI integration tests\n\n## Configuration\n\nDeployment steps live in `dotman.yaml`. Bootstrap steps live in\n`dotman.bootstrap.yaml`.\n\nSupported directives:\n\n- `defaults`\n- `link`\n- `create`\n- `shell`\n- `clean`: planned / dry-run placeholder\n\nExample:\n\n```yaml\n- defaults:\n    link:\n      create: true\n      relink: true\n      relative: true\n    shell:\n      stdout: true\n      stderr: true\n\n- link:\n    ~/.config/fish: config/fish\n    ~/.config/nvim: config/nvim\n\n- create:\n    - ~/.config/fish/local.d\n\n- shell:\n    - command: fish -lc 'type -q fisher; or curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source; and fisher update'\n      description: Sync fish plugins\n      optional: true\n```\n\nField reference:\n\n- `defaults.link.create`: create missing parent directories for link targets.\n- `defaults.link.relink`: replace an existing symlink when it points somewhere else.\n- `defaults.link.backup`: move an existing conflicting target aside before linking.\n- `defaults.link.relative`: create relative symlinks.\n- `defaults.shell.stdout`: inherit stdout from shell commands.\n- `defaults.shell.stderr`: inherit stderr from shell commands.\n- `link`: maps target paths to source paths. A link item can also use `path` plus\n  per-item `create`, `relink`, `backup`, `relative`, and `if` overrides.\n- `create`: creates directories, following existing symlinked path components.\n- `shell.command`: command to run through `sh -c`.\n- `shell.description`: human-readable label shown in logs.\n- `shell.if`: shell condition that must succeed before the command runs.\n- `shell.optional`: if `true`, a failed command is reported as a warning and\n  later steps continue. Defaults to `false`.\n- `shell.stdout` / `shell.stderr`: per-command output overrides.\n- `clean`: parsed and shown in dry-runs, but non-dry-run cleanup is not implemented yet.\n\nDeploy is fail-fast for core file operations: link/create failures stop the run.\nNetwork-sensitive sync commands can be marked with `optional: true` so transient\nfailures do not make the whole deploy fail.\n\n## Local Overrides\n\nMachine-specific paths, tokens, and temporary tool setup should stay out of the\nshared repository.\n\nFish loads local-only files from:\n\n```text\n~/.config/fish/local.d/*.fish\n```\n\nFor first-time setup on a new machine, follow [docs/new-machine.md](docs/new-machine.md).\n\n## Development\n\n```sh\nmake build\nmake lint\nmake test\nmake ci\n```\n\n## Publishing\n\nThe website build publishes the installer and runtime bundle:\n\n```sh\nscripts/build-site.sh\n```\n\nUse this for Vercel:\n\n- Build Command: `scripts/build-site.sh`\n- Output Directory: `public`\n\n`public/manifest.json` points at `bundle/latest.tar.gz` on\n`dotfiles.tabsp.com` and at dotman binaries from the latest GitHub Release.\nTagging `v*` runs the release workflow that builds those dotman binaries.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftabsp%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftabsp%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftabsp%2Fdotfiles/lists"}