[![Gem Version](https://badge.fury.io/rb/friends.svg)](https://badge.fury.io/rb/friends) [![Code Coverage](https://codecov.io/gh/JacobEvelyn/friends/branch/main/graph/badge.svg)](https://codecov.io/gh/JacobEvelyn/friends) [![Tests](https://github.com/JacobEvelyn/friends/workflows/Main/badge.svg)](https://github.com/JacobEvelyn/friends/actions?query=workflow%3AMain) [![Readme Score](http://readme-score-api.herokuapp.com/score.svg?url=JacobEvelyn/friends&bust=1)](http://clayallsopp.github.io/readme-score?url=JacobEvelyn/friends) [![Inline docs](http://inch-ci.org/github/JacobEvelyn/friends.png)](http://inch-ci.org/github/JacobEvelyn/friends) [![Gem](https://img.shields.io/gem/dt/friends.svg)](https://rubygems.org/gems/friends) `friends` is a volunteer project. If you find it valuable, please consider making a small donation (πŸ™) with the **Sponsor** button at the top of this page to show you appreciate its continued development. # `friends` Spend time with the people you care about. Introvert-tested. Extrovert-approved. **NOTE: Participation is encouraged! Make issues, ask questions, submit pull requests (even if it's your first time contributing to open-sourceβ€”you'll get lots of help), and give feedback! This project is [very much alive](https://github.com/JacobEvelyn/friends/issues/233)!** ## Table of Contents - [Overview](#overview) - [Installation](#installation) - [A note on output](#a-note-on-output) - [Usage](#usage) - [Core concepts](#core-concepts) - [Global flags](#global-flags) - [Syncing across multiple machines](#syncing-across-multiple-machines) - [Setting reminders](#setting-reminders) - [Command reference](#command-reference) - `add` - [`add activity`](#add-activity) - [Setting a default location](#setting-a-default-location) - [`add note`](#add-note) - [`add friend`](#add-friend) - [`add tag`](#add-tag) - [`add location`](#add-location) - [`add nickname`](#add-nickname) - [`add alias`](#add-alias) - [`clean`](#clean) - [`graph`](#graph) - [`help`](#help) - `list` - [`list activities`](#list-activities) - [`list notes`](#list-notes) - [`list friends`](#list-friends) - [`list tags`](#list-tags) - [`list locations`](#list-locations) - [Advanced searching](#advanced-searching) - `remove` - [`remove tag`](#remove-tag) - [`remove nickname`](#remove-nickname) - [`remove alias`](#remove-alias) - `rename` - [`rename friend`](#rename-friend) - [`rename location`](#rename-location) - [`set location`](#set-location) - [`stats`](#stats) - [`suggest`](#suggest) - [`update`](#update) - [Other documentation](#other-documentation) - [Contributing (it's encouraged!)](#contributing-its-encouraged) - [Code of Conduct](#code-of-conduct) - [License](#license) --- ## Overview `friends` is a command-line program that helps you to keep track of your relationships with the people you care about. `friends` gives you: - More organization around staying in touch with friends and family. - A way to track the ebbs and flows of your relationships over time. - Suggestions for who to call or hang out with when you have free time, whether it's fifteen minutes or an entire weekend. - A low-cost way to record and remember big moments in your life. Its philosophy emphasizes: - **Simplicity**β€”it should be quick and easy to use. - **Transparency**β€”all data is stored in a human-readable Markdown file. No proprietary formats here! And in addition to being open-source, `friends` is very much open to new ideas. Please [contribute](https://github.com/JacobEvelyn/friends#contributing-its-encouraged)! - **Intelligence**β€”specify dates with English phrases like "yesterday." Specify friends with their first names, even when you're friends with many *Joanne*s. `friends` will figure it out. ## Installation ``` $ gem install friends ``` Easy, huh? ## A note on output To make its output easier to view and work with, `friends` "pages" its output. This means that when it has a lot to print it will let you scroll up or down in your terminal to view all of it. By default, `friends` tries to use the `less -RFX` command for paging, which should be available on most systems, and if that is not available falls back to simply printing the output. However, you can set a different pager by setting the `FRIENDS_PAGER` environment variable. If you have `less` [version 530](http://www.greenwoodsoftware.com/less/news.530.html) or later [we recommend using](https://unix.stackexchange.com/a/432254/181957#comment784324_432254) this instead: ```bash FRIENDS_PAGER="less -RF" ``` ## Usage ### Core concepts `friends` is structured around several different types of things: - **Activities**: The things you do. Each activity has a date associated with it. Activities may optionally contain any number of _friends_, _locations_, and _tags_. - **Friends**: The people you do _activities_ with. Each friend has a name and, optionally, one or several nicknames. (Examples: `John`, `Grace Hopper`) - **Locations**: The places in which _activities_ happen. (Examples: `Paris`, `Martha's Vineyard`) - **Tags**: A way to categorize your _activities_ with tags of your choosing. Tags may contain colons and hyphens inside them. (Examples: `@exercise:running`, `@school`, `@science:indoors:agronomy-with-hydroponics`) - **Notes**: Any additional information you want to record about a _friend_ or _location_. (Example: `John and Jane got engaged.`) The `friends.md` Markdown file that stores all of your data contains: - an alphabetical list of all locations: ```markdown ### Locations: - Atlantis - Martha's Vineyard - Paris ``` - an alphabetical list of all friends and their nicknames and locations: ```markdown ### Friends: - George Washington Carver - Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris] - Marie Curie [Atlantis] ``` - an ordered list of all activities: ```markdown ### Activities: - 2018-11-01: **Grace Hopper** and I went to _Martha's Vineyard_. George had to cancel at the last minute. - 2018-01-04: Got lunch with **Grace Hopper** and **George Washington Carver**. - 2017-12-31: Celebrated the new year in _Paris_ with **Marie Curie**. - 2017-11-15: Talked to **George Washington Carver** on the phone for an hour. ``` - and an ordered list of all notes: ```markdown ### Notes: - 2018-06-15: **Grace Hopper** found out she's getting a big Naval Academy building named after her. @navy - 2017-06-06: **Marie Curie** just got accepted into a PhD program in _Paris_. @school ``` See the example [`friends.md`](https://github.com/JacobEvelyn/friends/blob/main/friends.md) file for more information. ### Global flags `friends` supports several global flags that can be used on any command when specified before the name of the command, like: `friends [flags] [command]`. These flags are: - `--colorless`: Disable output colorization and other effects. - `--debug`: Debug error messages with a full backtrace. - `--filename`: Set the location of the friends file to use (default: `~/friends.md`). ```bash $ friends --filename ./test/tmp/friends.md clean File cleaned: "./test/tmp/friends.md" ``` - `--quiet`: Quiet output messages. ```bash $ friends --quiet add activity Went rollerskating with George. $ # No output! ``` In addition, these flags may be used without any command: - `--help`: Show the help menu. This is equivalent to `friends help`. Help menus are available for all levels of commands: ```bash $ friends --help ``` ```bash $ friends list --help ``` ```bash $ friends list activities --help ``` - `--version`: Show the `friends` program version. ### Syncing across multiple machines Wouldn't it be nice to be able to use `friends` across all of your devices? Hooray, you can! Just put the `friends.md` file in your Dropbox/Box Sync/Google Drive/whatever folder and use the `--filename` flag. You can even set up a Bash/Zsh/whatever alias to do this for you, like so: ```bash alias friends="friends --filename '~/Dropbox/friends.md'" ``` ### Setting reminders Though `friends` has no built-in reminder functionality, it's easy to use a system like `cron` (Mac or Linux) or `Task Scheduler` (Windows) to set various reminders. For example, on a Mac, the following `crontab` configuration results in every day at 9:00 p.m. a Terminal tab opening, printing "Time to journal!" and then launching an `add activity` prompt through `friends`: ``` 0 21 * * * osascript -e 'activate application "Terminal"' &> /dev/null && osascript -e 'tell application "Terminal" to do script "clear && echo Time to journal! && friends add activity"' &> /dev/null ``` Here's another example (also for Mac) of using `friends` to suggest some people to hang out with every Saturday morning: ``` 0 10 * * 6 osascript -e 'activate application "Terminal"' &> /dev/null && osascript -e 'tell application "Terminal" to do script "clear && echo Consider hanging out with one of these friends today: && friends suggest"' &> /dev/null ``` (If you use other tools, please share and we'll add to these examples!) ### Command reference\* \*Note that the command-line output is colored, which this README cannot show. #### `add activity` ```bash $ friends add activity Got lunch with Grace and George. Activity added: "2018-01-04: Got lunch with Grace Hopper and George Washington Carver." ``` `friends` will **automatically** figure out which "Grace" and "George" you're referring to, _even if you're friends with lots of different Graces and Georges_. Nicknames will be used to match friends in activities, just like formal names: ```bash $ friends add activity Invented debugging with The Admiral. Activity added: "2017-01-06: Invented debugging with Grace Hopper." ``` You can also use the first initial of a last name instead of the whole thing. `friends` will figure out what to do with those pesky periods (if you include them) based on whether you're in the middle of a sentence or not: ```bash $ friends add activity Got lunch with Earnest H and Earnest S. in the park. Man, I like Earnest H. but really love Earnest S. Activity added: "2017-05-01: Got lunch with Earnest Hemingway and Earnest Shackleton in the park. Man, I like Earnest Hemingway but really love Earnest Shackleton." ``` And locations or their aliases will be matched as well: ```bash $ friends add activity Went swimming near atlantis with George. Activity added: "2017-01-06: Went swimming near Atlantis with George Washington Carver." $ friends add activity Had lunch in nyc with George. Activity added: "2017-01-06: Had lunch in New York City with George Washington Carver." ``` Tags will be colored if they're provided (though this README can't display color so you'll just have to have faith here): ```bash $ friends add activity The office softball team wins a game! @work @exercise:sports Activity added: "2017-05-05: The office softball team wins a game! @work @exercise:sports" ``` You can of course specify a date for the activity: ```bash $ friends add activity Yesterday: Celebrated the new year with Marie. Activity added: "2017-12-31: Celebrated the new year with Marie Curie." ``` Or get an **interactive prompt** by just typing `friends add activity`, with or without a date specified: ```bash $ friends add activity 2018-11-01 2018-11-01: ``` **Natural-language dates** work just fine: ```bash $ friends add activity last Monday 2017-03-07: ``` You can escape the names of friends you don't want `friends` to match with a backslash: ```bash $ friends add activity "2018-11-01: Grace and I went to \Martha's Vineyard. \George had to cancel at the last minute." Activity added: "2018-11-01: Grace Hopper and I went to Martha's Vineyard. George had to cancel at the last minute." ``` And if an activity contains friends or locations you haven't yet added, you can simply denote them with the signifiers found in the `friends.md` file (`**`s around friends, and `_`s around locations), and `friends` will automatically add the friends or locations that are missing: ```bash $ friends add activity "2018-11-01: I got to meet **Oprah Winfrey** in _Chicago_ today." Activity added: "2018-11-01: I got to meet Oprah Winfrey in Chicago today." Friend added: "Oprah Winfrey" Location added: "Chicago" ``` This is really handy for when you have an activity involving a friend or location that you can't remember if you've already added. Just use the signifiers and they'll be added if necessary! ##### Setting a default location When an activity includes the phrase to \_LOCATION\_ (e.g., Took a plane to \_Paris\_), all future activities that have no explicit location will be associated with that location: ```bash $ friends add activity Took a plane to Paris Activity added: "2020-01-04: Took a plane to Paris" Default location set to: "Paris" $ friends add activity Ate lunch at a charming cafΓ© Activity added: "2020-01-04: Ate lunch at a charming cafΓ©" $ friends add activity Left the city to go to Chamonix Activity added: "2020-01-04: Left the city to go to Chamonix" Default location set to: "Chamonix" ``` ```bash $ friends list activities --in Paris 2019-01-04: Ate lunch at a charming cafΓ© 2019-01-04: Took a plane to Paris ``` #### `add note` Notes can be added exactly like activities, either on one line: ```bash $ friends add note Yesterday: Marie got accepted into a PhD program Note added: "2017-12-31: Marie Curie got accepted into a PhD program" ``` Or with a prompt: ```bash $ friends add note last Monday 2017-03-07: ``` And just like with `add activity`, dates, friends, locations, nicknames, and tags will all be intelligently matched. In addition, as with `add activity` you can use the `**`/`_` signifiers around friend and location names and they'll be added if necessary: ```bash $ friends add note "2018-11-01: **Oprah Winfrey** grew up in _Chicago_." Activity added: "2018-11-01: Oprah Winfrey grew up in Chicago." Friend added: "Oprah Winfrey" Location added: "Chicago" ``` This is really handy for when you have a note involving a friend or location that you can't remember if you've already added. Just use the signifiers and they'll be added if necessary! #### `add friend` ```bash $ friends add friend Grace Hopper Friend added: "Grace Hopper" ``` #### `add tag` ```bash $ friends add tag Grace Hopper science Tag added to friend: "Grace Hopper @science" ``` #### `add location` ``` $ friends add location Atlantis Location added: "Atlantis" ``` #### `add nickname` ```bash $ friends add nickname "Grace Hopper" "The Admiral" Nickname added: "Grace Hopper (a.k.a. The Admiral)" $ friends add nickname "Grace Hopper" "Amazing Grace" Nickname added: "Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace)" ``` #### `add alias` ```bash $ friends add alias "New York City" "NYC" Alias added: "New York City (a.k.a. NYC)" $ friends add alias "New York City" "Big Apple" Alias added: "New York City (a.k.a. NYC a.k.a. Big Apple)" ``` #### `clean` Reads and re-writes the `friends.md` file: ```bash $ friends clean File cleaned: "~/friends.md" ``` This command is useful after manual editing of the file, for re-ordering its contents and adding any missing friends or locations that are found in activities or notes. Note that `friends clean` is automatically called after the editor in `friends edit` is closed. #### `edit` Allows you to manually edit the file: ```bash $ friends edit Opening "~/friends.md" with "vim" ``` The file is opened with the command specified by the `EDITOR` environment variable, falling back to `vim` if it is not set: ```bash $ export EDITOR='atom --wait' $ friends edit Opening "~/friends.md" with "atom --wait" ``` Note that when setting your own `EDITOR` value, if you like to use an editor like Atom, VS Code, or Sublime Text, you should first make sure you have the command-line tool for your editor (`atom`, `code`, or `subl`) installed correctly so you can open your editor from the command line. Then, when setting `EDITOR`, make sure to use the `--wait` flag (as in the example above), which will allow `friends` to be able to run the `clean` command (see below). After the editor has been closed, `friends` will automatically run the `clean` command to re-organize the file and add any friends or locations you've referenced in activities or notes that have not been added to the file. This means that, similar to the `add activity` and `add note` commands, you can add lines like: ```markdown - 2018-01-01: I just met **Oprah Winfrey** in _Chicago_! ``` And if that friend or location isn't already present it'll be added: ```bash Friend added: "Oprah Winfrey" Location added: "Chicago" File cleaned: "~/friends.md" ``` #### `graph` Graphs (in color!) your activities over time: ```bash $ friends graph Feb 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ Dec 2017 |β–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` By default, graphs are scaled relative to the month with the most activities. You can also show the unscaled graph: ```bash $ friends graph --unscaled Feb 2018 |β–ˆβ–ˆ Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ Dec 2017 |β–ˆ Nov 2017 |β–ˆβ–ˆβ–ˆ ``` You can graph only activities with a certain friend: ```bash $ friends graph --with George Feb 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™| Dec 2017 |β–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` The dots represent the total activities of each month, so you can get a feel for the proportion of activities with that friend vs. the total you've logged. You can also graph a certain group of friends: ```bash $ friends graph --with George --with Grace Feb 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Dec 2017 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |β–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` Or graph only activities with a certain tag: ```bash $ friends graph --tagged food Feb 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Dec 2017 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` Or with multiple tags: ```bash $ friends graph --tagged fun --tagged work Feb 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Dec 2017 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |β–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` Or graph only activities in a certain location: ```bash $ friends graph --in Paris Feb 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Dec 2017 |β–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` Or graph only activities on or after a certain date: ```bash $ friends graph --since 'January 21st 2018' Feb 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Jan 2018 |β–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` Or graph only activities before or on a certain date: ```bash $ friends graph --until 'January 1st 2018' Jan 2018 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Dec 2017 |β–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Nov 2017 |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| ``` And you can use multiple of these flags together: ```bash $ friends graph --unscaled --in Paris --tagged food --with George --since 'Jan 2018' Jan 2018 |βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™βˆ™| Fen 2017 |β–ˆβˆ™βˆ™βˆ™βˆ™| ``` #### `help` Displays a help menu. This is equivalent to `friends --help`. ```bash $ friends help NAME friends - Spend time with the people you care about. Introvert-tested. Extrovert-approved. SYNOPSIS friends [global options] command [command options] [arguments...] ... ``` Help menus are available for all levels of commands: ```bash $ friends help ``` ```bash $ friends help list ``` ```bash $ friends help list activities ``` #### `list activities` Lists recent activities: ```bash $ friends list activities 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food 2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop 2017-11-15: Talked to George Washington Carver on the phone for an hour. ``` You can list the activities you did with a certain friend: ```bash $ friends list activities --with George 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food 2017-11-15: Talked to George Washington Carver on the phone for an hour. ``` Or only activities done with a group of friends: ```bash $ friends list activities --with George --with Grace 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food ``` Or filter your activities by location: ```bash $ friends list activities --in "New York" 2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop ``` Or by tag: ```bash $ friends list activities --tagged food 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food ``` Or use more than one tag: ```bash $ friends list activities --tagged fun --tagged work 2018-07-04: Summer picnic with @work colleagues. @fun ``` Or by date: ```bash $ friends list activities --since 'December 31st 2017' 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food 2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop ``` ```bash $ friends list activities --until 'December 31st 2017' 2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop 2017-11-15: Talked to George Washington Carver on the phone for an hour. ``` And you can mix and match these options to your heart's content: ```bash $ friends list activities --tagged food --with Grace --with George 2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food ``` #### `list notes` You can list notes the same way you list activities: ```bash $ friends list notes --tagged school --with Marie 2017-03-12: Marie Curie completed her PhD in record time. @school 2015-06-06: Marie Curie just got accepted into a PhD program in Paris. @school ``` #### `list friends` Lists all of your friends in alphabetical order: ```bash $ friends list friends George Washington Carver Grace Hopper Marie Curie ``` Or you can choose to sort by number of activities: ```bash $ friends list friends --sort n-activities 2 activities: George Washington Carver 2 activities: Grace Hopper 1 activity: Marie Curie ``` Or by most recent activity: ```bash $ friends list friends --sort recency 7 days ago: Grace Hopper 308 days ago: George Washington Carver 312 days ago: Marie Curie ``` And you can reverse the sorting at any time: ```bash $ friends list friends --sort n-activities --reverse 1 activity: Marie Curie 2 activities: Grace Hopper 2 activities: George Washington Carver ``` You can also include friend nicknames, locations, and tags: ```bash $ friends list friends --verbose George Washington Carver Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris] @navy @science Marie Curie [Atlantis] @science ``` You can filter your friends by location: ```bash $ friends list friends --in Paris Marie Curie ``` And you can also filter your friends by tag: ```bash $ friends list friends --tagged science Grace Hopper Marie Curie ``` You can even use more than one tag to further narrow down the list: ```bash $ friends list friends --tagged science --tagged navy Grace Hopper ``` #### `list tags` Lists all tags you've used, in alphabetical order: ```bash $ friends list tags @dancing @food @school @swanky ``` You can limit this to only tags from activities: ```bash $ friends list tags --from activities @dancing @food @swanky ``` Or only tags from friends: ```bash $ friends list tags --from friends @school @swanky ``` Or only tags from notes: ```bash $ friends list tags --from notes @navy @school ``` Or only tags from two out of three: ```bash $ friends list tags --from activities --from friends @dancing @food @navy @school @swanky ``` #### `list locations` Lists all of the locations you've added, in alphabetical order:: ``` $ friends list locations Atlantis New York City Paris ``` Or you can choose to sort by number of activities: ```bash $ friends list locations --sort n-activities 1 activity: New York City 1 activity: Paris 0 activities: Atlantis ``` Or by most recent activity: ```bash $ friends list locations --sort recency N/A days ago: Atlantis 7 days ago: New York City 312 days ago: Paris ``` And you can reverse the sorting at any time: ```bash $ friends list friends --sort n-activities --reverse 0 activities: Atlantis 1 activity: Paris 1 activity: New York City ``` You can also include location aliases: ```bash $ friends list locations --verbose Atlantis New York City (a.k.a. NYC) Paris ``` #### Advanced searching Since `friends` is a command-line program, we can easily support more complex searching by piping the output of a `list` command through a command-line tool like `grep`. For instance, to see all of the notes containing the string `PhD`: ```bash $ friends list notes | grep PhD 2017-07-01: Marie Curie just got accepted into a PhD program. 2017-06-10: John Doe is finishing his PhD. 2013-06-10: John Doe is just starting his PhD. ``` And you can combine this with the normal filter options provided by `friends`, like this: ```bash $ friends list notes --with John --since 'January 1st 2015' | grep PhD 2017-06-10: John Doe is finishing his PhD. ``` Note that `grep` has some handy flags, like `--ignore-case`/`-i`, and `--color=always`, to help customize your search: ```bash $ friends list notes --with John --since 'January 1st 2015' | grep -i PhD 2017-06-10: John Doe is finishing his PhD. 2016-06-01: I think John Doe is hoping to finish his phD about a year from now. ``` These `grep` flags might be slightly different depending on which version of `grep` you have installed. #### `remove tag` Removes a specific tag from a friend: ```bash $ friends remove tag Grace Hopper fun Tag removed from friend: "Grace Hopper (a.k.a. Amazing Grace) @OtherTag" ``` #### `remove nickname` Removes a specific nickname from a friend: ```bash $ friends remove nickname "Grace Hopper" "The Admiral" Nickname removed: "Grace Hopper (a.k.a. Amazing Grace)" ``` #### `remove alias` Removes a specific alias from a location: ```bash $ friends remove alias "New York City" "Big Apple" Alias removed: "New York City (a.k.a. NYC)" ``` #### `rename friend` ```bash $ friends rename friend "Grace Hopper" "Grace Brewster Murray Hopper" Name changed: "Grace Brewster Murray Hopper (a.k.a. Amazing Grace)" ``` This will update that friend's name in all notes and activities. #### `rename location` ```bash $ friends rename location Paris "Paris, France" Location renamed: "Paris, France" ``` This will update that location's name in all notes and activities. #### `set location` Sets a friend's location: ```bash $ friends set location Marie Paris Marie Curie's location set to: Paris ``` #### `stats` Gives you your lifetime usage stats: ```bash $ friends stats Total activities: 4 Total friends: 3 Total locations: 3 Total notes: 4 Total tags: 5 Total time elapsed: 848 days ``` #### `suggest` Gives you suggestions of up to three random friends to do something with, based on how often you've done things with them in the past: ```bash $ friends suggest Distant friend: Marie Curie Moderate friend: Grace Hopper Close friend: George Washington Carver ``` You can request suggestions of friends in a specific location: ```bash $ friends suggest --in Paris Distant friend: Marie Curie ``` #### `update` Updates `friends` to the latest version on RubyGems: ``` $ friends update Updated to friends 0.17 ``` ## Other documentation In case you're _really_ interested, we have documentation on [RubyDoc](http://www.rubydoc.info/github/JacobEvelyn/friends). ## Contributing (it's encouraged!) If you have an idea, [make a GitHub issue](https://github.com/JacobEvelyn/friends/issues/new)! Suggestions are very very welcome, and usually are implemented very quickly. And if you'd like to do the implementing yourself, see the [contributing guide](https://github.com/JacobEvelyn/friends/blob/main/.github/CONTRIBUTING.md). A big big thanks to all of this project's lovely [contributors](https://github.com/JacobEvelyn/friends/graphs/contributors): Another way to contribute is to make a donation with the **Sponsor** button at the top of this page! ### Backers Thank you to all backers! πŸ™ [[Become a backer](https://opencollective.com/friends#backer)] ### Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/friends#sponsor)] ## Code of Conduct Note that this project follows a [Code of Conduct](https://github.com/JacobEvelyn/friends/blob/main/CODE_OF_CONDUCT.md). If you're a polite, reasonable person you won't have any issues! ## License Friends is released under the [MIT License](https://github.com/JacobEvelyn/friends/blob/main/LICENSE.txt).