{"id":25695545,"url":"https://github.com/zenobi-us/dotfiles","last_synced_at":"2026-02-17T22:02:42.002Z","repository":{"id":63227527,"uuid":"256348899","full_name":"zenobi-us/dotfiles","owner":"zenobi-us","description":"my workstation setup for linux, windows and mac","archived":false,"fork":false,"pushed_at":"2026-02-14T15:22:39.000Z","size":77542,"stargazers_count":33,"open_issues_count":1,"forks_count":7,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-14T15:38:21.716Z","etag":null,"topics":["comtrya","provisioning"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/zenobi-us.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":"2020-04-16T23:01:02.000Z","updated_at":"2026-02-14T15:22:42.000Z","dependencies_parsed_at":"2024-07-26T00:49:19.524Z","dependency_job_id":"205b6c95-ad50-48b3-8ceb-35ee7c3acb66","html_url":"https://github.com/zenobi-us/dotfiles","commit_stats":null,"previous_names":["zenobi-us/dotfiles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zenobi-us/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenobi-us%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenobi-us%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenobi-us%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenobi-us%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zenobi-us","download_url":"https://codeload.github.com/zenobi-us/dotfiles/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenobi-us%2Fdotfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29559961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T21:50:49.831Z","status":"ssl_error","status_checked_at":"2026-02-17T21:46:15.313Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["comtrya","provisioning"],"created_at":"2025-02-25T00:52:01.788Z","updated_at":"2026-02-17T22:02:41.986Z","avatar_url":"https://github.com/zenobi-us.png","language":"TypeScript","readme":"# DotFiles\n\n- zsh\n- powershell\n\n## Install\n\n### linux\n\n```bash\ncurl -fsSL https://get.comtrya.dev | sh\ncomtrya -d https://github.com/airtonix/dotfiles apply\n```\n\n### macos\n\n```bash\ncurl -fsSL https://get.comtrya.dev | sh\ncomtrya -d https://github.com/airtonix/dotfiles apply\n```\n\n### windows\n\nfirst open powershell as admin and run:\n\n```powershell\nEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux,VirtualMachinePlatform -All -NoRestart\n```\n\nthen reboot. yes stop crying. just do it.\n\nAfter rebooting, run:\n\n```powershell\niwr \"https://get.comtrya.dev/ps\" -UseBasicParsing | iex\ncomtrya -d https://github.com/airtonix/dotfiles apply\n```\n\n## Intermediary Setup\n\nAbove would be useful if comtrya was perfect. However you may instead need to install individual parts:\n\n```sh\n$env:PATH+=\";$env:USERPROFILE\\.comtrya\"\ncd C:\\Users\\zeno.jiricek\\AppData\\Local\\comtrya\\manifests\\git\\githubcomairtonixdotfiles\ncomtrya apply -m manifest.dot.notated.path.instead.of.slash.notated.paths\n```\n\n## Usage\n\nThis is mostly a reminder for myself.\n\n```sh\ndotfiles apply # applies all changes\ndotfiles apply zsh # applies only zsh related changes\ndotfiles apply powershell # applies only powershell related changes\n\n# with or without commas\ndotfiles apply devtools.opencode,windowmanagers.sway # applies only devtools and sway window manager related changes\ndotfiles apply devtools.opencode windowmanagers.sway # applies only devtools and sway window manager related changes\n```\n\n---\n\n# Comtrya Quick Reference\n\n## CLI Commands\n\n| Command | Description |\n|---------|-------------|\n| `comtrya apply` | Apply all manifests in current directory |\n| `comtrya -d ./path apply` | Apply manifests from specific directory |\n| `comtrya -d ./ apply -m one,two,three` | Apply specific manifests by name |\n| `comtrya status` | List manifest status |\n| `comtrya contexts` | List available contexts |\n| `comtrya contexts --show-values` | Show context values |\n| `comtrya version` | Print version information |\n| `comtrya help` | Print help information |\n| `comtrya gen-completions` | Auto generate shell completions |\n\n## YAML Actions in Manifests\n\n### binary.github\nDownload binary from GitHub\n```yaml\n- action: binary.github\n  name: comtrya                    # binary name locally\n  directory: /usr/local/bin        # save location\n  repository: comtrya/comtrya      # github repo\n  version: v0.8.7                  # version/tag\n```\n\n### command.run (alias: cmd.run)\nRun arbitrary commands\n```yaml\n- action: command.run\n  command: echo\n  args:\n    - \"Hello world\"\n  dir: .                           # working directory (optional)\n  privileged: false                # elevate privileges (optional)\n  env:                             # scoped env vars (optional)\n    VAR_NAME: value\n```\n\n### file.copy\nCopy file from files directory to destination\n```yaml\n- action: file.copy\n  from: config_file                # source (under files/)\n  to: \"{{ user.config_dir }}/app\"  # destination\n  template: false                  # render with context (optional)\n  chmod: 644                       # octal permissions (optional)\n  owned_by_user: username          # chown user (optional, needs root)\n  owned_by_group: groupname        # chown group (optional, needs root)\n```\n\n### file.download\nDownload file from URL\n```yaml\n- action: file.download\n  from: https://example.com/file\n  to: /tmp/file\n  owned_by_user: user              # chown (optional, needs root)\n  owned_by_group: group            # chown (optional, needs root)\n```\n\n### file.link\nCreate symlinks\n```yaml\n# Single file\n- action: file.link\n  from: /root/symlink              # symlink location\n  to: managed_file                 # what it points to\n\n# Directory walk\n- action: file.link\n  source: walker\n  target: /tmp/walker-123\n  walk_dir: true                   # walk directory\n```\n\n### file.remove\nRemove file\n```yaml\n- action: file.remove\n  target: /tmp/some-file\n```\n\n### file.unarchive\nExtract tar.gz archives\n```yaml\n- action: file.unarchive\n  from: /tmp/archive.tar.gz\n  to: /tmp/extracted\n  force: true                      # force extraction (optional)\n```\n\n### directory.copy\nCopy directory\n```yaml\n- action: directory.copy\n  from: managed_directory          # source (under files/)\n  to: /root/location               # destination\n```\n\n### package.install\nInstall packages\n```yaml\n# Default provider\n- action: package.install\n  name: curl\n\n# Multiple packages\n- action: package.install\n  list:\n    - curl\n    - wget\n\n# Specific provider\n- action: package.install\n  name: curl\n  provider: pkgin                  # or: brew, apt, pacman, yay, dnf, etc.\n\n# From repository\n- action: package.install\n  name: blox\n  provider: homebrew\n  repository: cueblox/tap\n\n# Local file\n- action: package.install\n  name: /path/to/file.pkg\n  file: true\n```\n\n### package.repository\nConfigure package repositories (more docs needed)\n```yaml\n- action: package.repository\n  provider: apt\n  name: repository-name\n  url: https://repo.url\n  key: key_content\n```\n\n### file.chown\nChange file ownership\n```yaml\n- action: file.chown\n  path: ./files/some-file\n  user: username\n  group: groupname\n```\n\n## Context Variables Available\n\nUse `{{ variable_name }}` in templates and file.copy actions.\n\n### Environment Variables\nAll env vars accessible via `{{ env.VAR_NAME }}`\n```\nHOME, PATH, SHELL, USER, etc.\n```\n\n### OS Context\n```yaml\n{{ os.name }}                 # OS name\n{{ os.family }}               # OS family\n{{ os.version }}              # OS version\n{{ os.codename }}             # OS codename\n{{ os.edition }}              # OS edition\n{{ os.bitness }}              # 32 or 64\n{{ os.hostname }}             # System hostname\n```\n\n### User Context\n```yaml\n{{ user.name }}               # User display name\n{{ user.username }}           # Username\n{{ user.home_dir }}           # Home directory\n{{ user.config_dir }}         # Config directory\n{{ user.data_dir }}           # Data directory\n{{ user.data_local_dir }}     # Local data directory\n{{ user.document_dir }}       # Documents directory\n{{ user.id }}                 # User ID\n```\n\n**Resolved values by platform:**\n\n| Variable | Linux | macOS | Windows |\n|----------|-------|-------|---------|\n| `home_dir` | `/home/username` | `/Users/username` | `C:\\Users\\username` |\n| `config_dir` | `/home/username/.config` | `/Users/username/Library/Application Support` | `C:\\Users\\username\\AppData\\Roaming` |\n| `data_dir` | `/home/username/.local/share` | `/Users/username/Library/Application Support` | `C:\\Users\\username\\AppData\\Roaming` |\n| `data_local_dir` | `/home/username/.local/share` | `/Users/username/Library/Application Support` | `C:\\Users\\username\\AppData\\Local` |\n| `document_dir` | `unknown` | `/Users/username/Documents` | `C:\\Users\\username\\Documents` |\n| `name` | user display name | user display name | user display name |\n| `username` | `username` | `username` | `username` |\n| `id` | uid (e.g. 1000) | uid | N/A |\n\nUse `comtrya contexts --show-values` to see resolved values on your system.\n\n### Custom Variables\nDefine in manifest or include via `include_variables` directive\n\n## Supported Package Providers\n\n| Provider | OS |\n|----------|-----|\n| pacman/yay | Arch |\n| paru | Arch |\n| apt | Debian/Ubuntu |\n| pkg | FreeBSD |\n| pkgin | NetBSD (Multiple) |\n| brew | macOS |\n| winget | Windows |\n| xbps | Void Linux |\n| zypper | OpenSUSE |\n| macports | macOS |\n| dnf | Fedora |\n| snapcraft | Linux |\n\n## Key Tips\n\n- Manifest files must be YAML or TOML format\n- File references in `file.copy`, `file.link`, `directory.copy` must be under a `files/` directory\n- Use `{{ variable }}` for templating in file.copy with `template: true`\n- Template support works with file.download as well\n- Privilege escalation available via `privileged: true` in command.run\n- Scoped environment variables in command.run are injected before execution and removed after\n- View all available contexts with: `comtrya contexts --show-values`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenobi-us%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzenobi-us%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenobi-us%2Fdotfiles/lists"}