{"id":13395459,"url":"https://github.com/freshshell/fresh","last_synced_at":"2025-10-05T13:35:12.171Z","repository":{"id":4525217,"uuid":"5665287","full_name":"freshshell/fresh","owner":"freshshell","description":"Keep your dotfiles fresh.","archived":false,"fork":false,"pushed_at":"2023-08-24T03:58:28.000Z","size":1421,"stargazers_count":1188,"open_issues_count":43,"forks_count":86,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-04-08T15:15:00.722Z","etag":null,"topics":["dotfiles","fresh","freshrc"],"latest_commit_sha":null,"homepage":"https://freshshell.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freshshell.png","metadata":{"files":{"readme":"README.markdown","changelog":"CHANGELOG.markdown","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2012-09-03T23:49:29.000Z","updated_at":"2025-03-16T19:01:57.000Z","dependencies_parsed_at":"2024-01-03T04:12:45.654Z","dependency_job_id":"e4d152c5-187e-4416-b6f9-1f1063d4c8ff","html_url":"https://github.com/freshshell/fresh","commit_stats":{"total_commits":449,"total_committers":14,"mean_commits":32.07142857142857,"dds":0.6414253897550111,"last_synced_commit":"2debe33694110ccad2ff8238c682de3b901c23e8"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshshell%2Ffresh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshshell%2Ffresh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshshell%2Ffresh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshshell%2Ffresh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freshshell","download_url":"https://codeload.github.com/freshshell/fresh/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254478187,"owners_count":22077676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["dotfiles","fresh","freshrc"],"created_at":"2024-07-30T17:02:00.120Z","updated_at":"2025-10-05T13:35:07.121Z","avatar_url":"https://github.com/freshshell.png","language":"Ruby","readme":"# fresh\n\nKeep your dot files fresh.\n\nfresh is a tool to source shell configuration (aliases, functions, etc) from\nothers into your own configuration files. We also support files such as ackrc\nand gitconfig. Think of it as Bundler for your dot files.\n\nYou can use `fresh search` to find fresh lines that have been\nadded to the [directory].\n\n[![Build Status](https://travis-ci.com/freshshell/fresh.svg?branch=master)](https://travis-ci.com/freshshell/fresh)\n\n## Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n\t- [Sources](#sources)\n\t- [Shell files](#shell-files)\n\t- [Config files](#config-files)\n\t- [Bin files](#bin-files)\n\t- [Locking to specific Git references](#locking-to-specific-git-references)\n\t- [Filters](#filters)\n\t- [Option Blocks](#option-blocks)\n\t- [Advanced Usage](#advanced-usage)\n- [Command line options](#command-line-options)\n- [Maintainers](#maintainers)\n- [Licence](#licence)\n\n## Installation\n\nInstall [fresh](http://freshshell.com/) with the following:\n\n``` sh\nbash -c \"`curl -sL https://get.freshshell.com`\"\n```\n\nThis will:\n\n* Create a `~/.fresh` directory.\n* Clone the latest version of fresh into `~/.fresh/source/freshshell/fresh`.\n* Create a `~/.freshrc` file.\n\nYou will need to manually add `source ~/.fresh/build/shell.sh` to your shell config.\n\n### Manual steps\n\nDon't want to run our shell script? The installation is simple:\n\n``` sh\ngit clone https://github.com/freshshell/fresh ~/.fresh/source/freshshell/fresh\necho \"fresh freshshell/fresh bin/fresh --bin\" \u003e\u003e ~/.freshrc\n~/.fresh/source/freshshell/fresh/bin/fresh # run fresh\n# Add `source ~/.fresh/build/shell.sh` to your shell config.\n```\n\n## Usage\n\nAn example `~/.freshrc` file:\n\n``` sh\n# handles updating fresh\nfresh freshshell/fresh bin/fresh --bin\n\n# links your local ~/.dotfiles/gitconfig to ~/.gitconfig (you can change your local directory by setting $FRESH_LOCAL)\nfresh gitconfig --file\n\n# builds jasoncodes' aliases into ~/.fresh/build/shell.sh\nfresh jasoncodes/dotfiles shell/aliases/\\*\n\n# builds the shell/aliases/git.sh file into ~/.fresh/build/shell.sh\nfresh twe4ked/dotfiles shell/aliases/git.sh\n\n# links the config/ackrc file to ~/.ackrc\nfresh twe4ked/dotfiles config/ackrc --file\n\n# builds config/notmuch-config.erb with erb and links it to ~/.notmuch-config\nfresh neersighted/dotfiles config/notmuch-config.erb --file=~/.notmuch-config --filter=erb\n\n# links the gemdiff file to ~/bin/gem-diff\nfresh jasoncodes/dotfiles bin/gemdiff --bin=~/bin/gem-diff\n\n# builds the aliases/github.sh file locked to the specified git ref\nfresh twe4ked/dotfiles aliases/github.sh --ref=bea8134\n```\n\nRunning `fresh` will then build your shell configuration and create any relevant symbolic links.\n\n### Sources\n\n#### Local files\n\nIf no remote source is specified (`github_user/repo_name`), fresh will look for local files relative to `~/.dotfiles/`.\n\nFor example the following fresh line will look for `~/.dotfiles/shell/aliases/git.sh`.\n\n``` sh\nfresh shell/aliases/git.sh\n```\n\n#### GitHub repositories\n\nTo source from a GitHub repository you can specify the username and repo name separated with a slash:\n\n``` sh\nfresh username/repo example.sh\n```\n\n#### Non-GitHub sources\n\nYou can also source from non-GitHub repositories by specifying the full git clone URL:\n\n``` sh\nfresh git://example.com/path/to/repo.git example.sh\n```\n\n### Shell files\n\nWith no options, fresh will join specified shell files together.\n\n``` sh\nfresh twe4ked/dotfiles shell/aliases/git.sh\nfresh jasoncodes/dotfiles shell/aliases/\\*\n```\n\nJoins the `shell/aliases/git.sh` file from [twe4ked/dotfiles] with the `shell/aliases/*` files\nfrom [jasoncodes/dotfiles] into `~/.fresh/build/shell.sh`.\n\n### Config files\n\n``` sh\nfresh twe4ked/dotfiles config/ackrc --file\nfresh example/dotfiles pry.rb --file=~/.pryrc\n```\n\nLinks the `config/ackrc` file from [twe4ked/dotfiles] to `~/.ackrc`\nand the `pry.rb` file from example/dotfiles to `~/.pryrc`.\n\n#### A single config file built from multiple sources\n\n``` sh\nfresh jasoncodes/dotfiles config/tmux.conf --file\nfresh twe4ked/dotfiles config/tmux.conf --file\n```\n\nBuilds tmux configuration from both [jasoncodes/dotfiles] and [twe4ked/dotfiles]\ntogether into a single `~/.tmux.conf` output.\n\n#### Identifying source files in compiled output\n\nShell files automatically include comments before each section.\nTo add annotations to config files you can use the `--marker` option:\n\n``` sh\nfresh twe4ked/dotfiles 'vim/*' --file=~/.vimrc --marker='\"'\nfresh jasoncodes/dotfiles config/pryrc --file --marker\n```\n\n#### Ordering globbed directories\n\nUsing a glob to source multiple files from a single directory will read files in alphabetical order.\nIf you need to control the order in which files are sourced, you can create a `.fresh-order` file\nin the directory being globbed containing an ordered list of files to read first.\n\n#### Sourcing whole directories of files\n\nWhole directories or repositories can be built and symlinked by including a trailing slash on the `--file` path:\n\n``` sh\nfresh mutt --file=~/.mutt/\nfresh tpope/vim-pathogen . --file=~/.vim/bundle/vim-pathogen/ # whole repository\n```\n\n#### Building files without symlinking\n\nSome tools/libraries (e.g. zsh plugins) require specific directory structures.\nThese can be built within the build directory (`~/.fresh/build`) by specifying\na relative path on `--file`:\n\n``` sh\nfresh zsh-users/zsh-syntax-highlighting zsh-syntax-highlighting.zsh --file=vendor/zsh-syntax-highlighting.zsh\nfresh zsh-users/zsh-syntax-highlighting highlighters --file=vendor/highlighters/\n```\n\nThese files can then be sourced from your main shell config with:\n\n``` sh\nsource ~/.fresh/build/vendor/zsh-syntax-highlighting.zsh\n```\n\n### Bin files\n\n``` sh\nfresh jasoncodes/dotfiles bin/sedmv --bin\nfresh jasoncodes/dotfiles bin/gemdiff --bin=~/bin/gem-diff\n```\n\nLinks the `sedmv` file from [jasoncodes/dotfiles] to `~/bin/sedmv`\nand the `gemdiff` file from [jasoncodes/dotfiles] to `~/bin/gem-diff`.\n\n### Locking to specific Git references\n\n``` sh\nfresh twe4ked/dotfiles aliases/github.sh --ref=bea8134\n```\n\nLocks the `aliases/github.sh` file to the specified commit.\nYou can use any Git reference: branches, commit hashes, tags, etc.\n\n### Filters\n\n[Filters][filters] allow you to run specified files through arbitrary commands at build time.\n\n``` sh\nfresh neersighted/dotfiles config/muttrc.erb.asc --file=~/.muttrc --filter=\"gpg | erb\"\n```\n\n[filters]: https://github.com/freshshell/fresh/wiki/Filters\n\n### Option Blocks\n\nIf you have a section of your `~/.freshrc` file where multiple lines need the same options\nyou can use `fresh-options` to reduce duplication.\n\n``` sh\n# ~/.freshrc\nfresh-options --file=~/.vimrc --marker=\\\"\n  fresh twe4ked/dotfiles vim/vundle_before.vim\n  fresh vim/vundle.vim\n  fresh twe4ked/dotfiles vim/vundle_after.vim\n  fresh vim/mappings.vim\nfresh-options\n```\n\n`fresh-options` overrides any previous `fresh-options` calls.\nPassing no arguments resets back to the default.\n\n### Advanced Usage\n\nThere are many other ways you can customize fresh.\nCheck out our [advanced usage wiki pages][advanced usage] for more information.\n\n[advanced usage]: https://github.com/freshshell/fresh/wiki#advanced-usage\n\n## Command line options\n\n### Install\n\nRunning `fresh` or `fresh install` will build shell configuration and relevant\nsymlinks.\n\n### Update\n\nRunning `fresh update` will update sources from GitHub repositories and run `fresh install`.\n\nYou can also optionally supply a GitHub username or username/repo:\n\n``` sh\nfresh update jasoncodes       # update all jasoncodes' repos\nfresh update twe4ked/dotfiles # update twe4ked's dotfiles\n```\n\n#### Local dotfiles\n\n`fresh update` without any arguments will also fetch any changes made to your local dotfiles stored in `~/.dotfiles`.\nYou can update just your local dofiles by specifying the `--local` option.\n\n### Clean\n\nWhen you remove a source from your `~/.freshrc` or remove a `--file`/`--bin`\nline, you can use `fresh clean` to remove dead symlinks and source repos.\n\n### Search\n\nYou can search our [fresh directory][directory] using `fresh search`.\nFeel free to add your own fresh lines to the wiki page!\n\nTry:\n\n``` sh\nfresh search twe4ked\nfresh search jasoncodes\n# or\nfresh search ruby\n```\n\n### Edit\n\nRunning `fresh edit` will open your `~/.freshrc` in your default `$EDITOR`.\n\n### Show\n\n`fresh show` will output each line of your `~/.freshrc` along with\nevery source file those lines match. Handy for auditing.\n\n### Subcommands\n\nfresh will detect bin files that start with `fresh-` in your `$PATH`.\n\nFor example running `fresh open` is equivalent to running `fresh-open`.\n\n### Adding Lines Directly From The Command line\n\nYou can append fresh lines to your freshrc directly from the command line.\n\nTry running:\n\n``` sh\nfresh twe4ked/catacomb bin/catacomb --bin\n# or\nfresh https://github.com/twe4ked/catacomb/blob/master/bin/catacomb\n```\n\nYou will then get a prompt comfirming that you wish to add the new line.\nYou can then modify it if needed by running `fresh edit`.\n\n## Maintainers\n\nfresh is maintained by [jasoncodes] and [twe4ked].\n\n## Licence\n\nMIT\n\n[jasoncodes/dotfiles]: https://github.com/jasoncodes/dotfiles\n[twe4ked/dotfiles]: https://github.com/twe4ked/dotfiles\n[jasoncodes]: https://github.com/jasoncodes\n[twe4ked]: https://github.com/twe4ked\n[directory]: https://github.com/freshshell/fresh/wiki/Directory\n","funding_links":[],"categories":["Ruby","others","dotfiles","Shell Package Management"],"sub_categories":["Directory Navigation"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreshshell%2Ffresh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreshshell%2Ffresh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreshshell%2Ffresh/lists"}