{"id":24113698,"url":"https://github.com/jacobevelyn/friends","last_synced_at":"2025-05-15T09:02:31.621Z","repository":{"id":22983594,"uuid":"26333885","full_name":"JacobEvelyn/friends","owner":"JacobEvelyn","description":"Spend time with the people you care about. Introvert-tested. Extrovert-approved.","archived":false,"fork":false,"pushed_at":"2021-07-25T16:16:47.000Z","size":700,"stargazers_count":879,"open_issues_count":15,"forks_count":38,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-04-10T00:27:04.699Z","etag":null,"topics":["cli","crm","customer-relationship-management","diary","diary-application","family","friends","friendship","friendships","human-readable","human-readable-interface","human-readable-representations","journal","journal-application","journaling","markdown","quantified-self","relationships","ruby","tagging"],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/JacobEvelyn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"JacobEvelyn","open_collective":"jacobevelyn","liberapay":"jacobevelyn","custom":"https://paypal.me/JacobEvelyn"}},"created_at":"2014-11-07T19:12:41.000Z","updated_at":"2025-04-02T18:03:10.000Z","dependencies_parsed_at":"2022-09-09T09:20:39.031Z","dependency_job_id":null,"html_url":"https://github.com/JacobEvelyn/friends","commit_stats":null,"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JacobEvelyn%2Ffriends","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JacobEvelyn%2Ffriends/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JacobEvelyn%2Ffriends/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JacobEvelyn%2Ffriends/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JacobEvelyn","download_url":"https://codeload.github.com/JacobEvelyn/friends/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248890818,"owners_count":21178513,"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":["cli","crm","customer-relationship-management","diary","diary-application","family","friends","friendship","friendships","human-readable","human-readable-interface","human-readable-representations","journal","journal-application","journaling","markdown","quantified-self","relationships","ruby","tagging"],"created_at":"2025-01-11T04:24:35.879Z","updated_at":"2025-04-14T13:48:13.047Z","avatar_url":"https://github.com/JacobEvelyn.png","language":"Ruby","funding_links":["https://github.com/sponsors/JacobEvelyn","https://opencollective.com/jacobevelyn","https://liberapay.com/jacobevelyn","https://paypal.me/JacobEvelyn","https://opencollective.com/friends"],"categories":[],"sub_categories":[],"readme":"[![Gem Version](https://badge.fury.io/rb/friends.svg)](https://badge.fury.io/rb/friends)\n[![Code Coverage](https://codecov.io/gh/JacobEvelyn/friends/branch/main/graph/badge.svg)](https://codecov.io/gh/JacobEvelyn/friends)\n[![Tests](https://github.com/JacobEvelyn/friends/workflows/Main/badge.svg)](https://github.com/JacobEvelyn/friends/actions?query=workflow%3AMain)\n[![Readme Score](http://readme-score-api.herokuapp.com/score.svg?url=JacobEvelyn/friends\u0026bust=1)](http://clayallsopp.github.io/readme-score?url=JacobEvelyn/friends)\n[![Inline docs](http://inch-ci.org/github/JacobEvelyn/friends.png)](http://inch-ci.org/github/JacobEvelyn/friends)\n[![Gem](https://img.shields.io/gem/dt/friends.svg)](https://rubygems.org/gems/friends)\n\n`friends` is a volunteer project. If you find it valuable, please consider\nmaking a small donation (🙏) with the **Sponsor** button at the top of this page\nto show you appreciate its continued development.\n\n# `friends`\n\nSpend time with the people you care about. Introvert-tested.\nExtrovert-approved.\n\n**NOTE: Participation is encouraged! Make issues, ask questions, submit pull\nrequests (even if it's your first time contributing to open-source—you'll get\nlots of help), and give feedback! This project is\n[very much alive](https://github.com/JacobEvelyn/friends/issues/233)!**\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Installation](#installation)\n- [A note on output](#a-note-on-output)\n- [Usage](#usage)\n  - [Core concepts](#core-concepts)\n  - [Global flags](#global-flags)\n  - [Syncing across multiple machines](#syncing-across-multiple-machines)\n  - [Setting reminders](#setting-reminders)\n  - [Command reference](#command-reference)\n    - `add`\n      - [`add activity`](#add-activity)\n        - [Setting a default location](#setting-a-default-location)\n      - [`add note`](#add-note)\n      - [`add friend`](#add-friend)\n      - [`add tag`](#add-tag)\n      - [`add location`](#add-location)\n      - [`add nickname`](#add-nickname)\n      - [`add alias`](#add-alias)\n    - [`clean`](#clean)\n    - [`graph`](#graph)\n    - [`help`](#help)\n    - `list`\n      - [`list activities`](#list-activities)\n      - [`list notes`](#list-notes)\n      - [`list friends`](#list-friends)\n      - [`list tags`](#list-tags)\n      - [`list locations`](#list-locations)\n      - [Advanced searching](#advanced-searching)\n    - `remove`\n      - [`remove tag`](#remove-tag)\n      - [`remove nickname`](#remove-nickname)\n      - [`remove alias`](#remove-alias)\n    - `rename`\n      - [`rename friend`](#rename-friend)\n      - [`rename location`](#rename-location)\n    - [`set location`](#set-location)\n    - [`stats`](#stats)\n    - [`suggest`](#suggest)\n    - [`update`](#update)\n- [Other documentation](#other-documentation)\n- [Contributing (it's encouraged!)](#contributing-its-encouraged)\n- [Code of Conduct](#code-of-conduct)\n- [License](#license)\n\n---\n\n## Overview\n\n`friends` is a command-line program that helps you to keep track of your relationships with the\npeople you care about.\n\n`friends` gives you:\n\n- More organization around staying in touch with friends and\n  family.\n- A way to track the ebbs and flows of your relationships over\n  time.\n- Suggestions for who to call or hang out with when you have free\n  time, whether it's fifteen minutes or an entire weekend.\n- A low-cost way to record and remember big moments in your life.\n\nIts philosophy emphasizes:\n\n- **Simplicity**—it should be quick and easy to use.\n- **Transparency**—all data is stored in a human-readable Markdown file. No\n  proprietary formats here! And in addition to being open-source, `friends` is\n  very much open to new ideas. Please\n  [contribute](https://github.com/JacobEvelyn/friends#contributing-its-encouraged)!\n- **Intelligence**—specify dates with English phrases like \"yesterday.\" Specify\n  friends with their first names, even when you're friends with many *Joanne*s.\n  `friends` will figure it out.\n\n## Installation\n\n```\n$ gem install friends\n```\n\nEasy, huh?\n\n## A note on output\n\nTo make its output easier to view and work with, `friends` \"pages\" its output.\nThis means that when it has a lot to print it will let you scroll up or down\nin your terminal to view all of it.\n\nBy default, `friends` tries to use the `less -RFX` command for paging, which should\nbe available on most systems, and if that is not available falls back to simply\nprinting the output. However, you can set a different pager by setting the `FRIENDS_PAGER`\nenvironment variable. If you have `less`\n[version 530](http://www.greenwoodsoftware.com/less/news.530.html) or later\n[we recommend using](https://unix.stackexchange.com/a/432254/181957#comment784324_432254)\nthis instead:\n\n```bash\nFRIENDS_PAGER=\"less -RF\"\n```\n\n## Usage\n\n### Core concepts\n\n`friends` is structured around several different types of things:\n\n- **Activities**: The things you do. Each activity has a date associated with\n  it. Activities may optionally contain any number of _friends_, _locations_,\n  and _tags_.\n- **Friends**: The people you do _activities_ with. Each friend has a name and,\n  optionally, one or several nicknames. (Examples: `John`, `Grace Hopper`)\n- **Locations**: The places in which _activities_ happen. (Examples: `Paris`,\n  `Martha's Vineyard`)\n- **Tags**: A way to categorize your _activities_ with tags of your\n  choosing. Tags may contain colons and hyphens inside them. (Examples: `@exercise:running`, `@school`, `@science:indoors:agronomy-with-hydroponics`)\n- **Notes**: Any additional information you want to record about a _friend_\n  or _location_. (Example: `John and Jane got engaged.`)\n\nThe `friends.md` Markdown file that stores all of your data contains:\n\n- an alphabetical list of all locations:\n\n```markdown\n### Locations:\n\n- Atlantis\n- Martha's Vineyard\n- Paris\n```\n\n- an alphabetical list of all friends and their nicknames and locations:\n\n```markdown\n### Friends:\n\n- George Washington Carver\n- Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris]\n- Marie Curie [Atlantis]\n```\n\n- an ordered list of all activities:\n\n```markdown\n### Activities:\n\n- 2018-11-01: **Grace Hopper** and I went to _Martha's Vineyard_. George had to cancel at the last minute.\n- 2018-01-04: Got lunch with **Grace Hopper** and **George Washington Carver**.\n- 2017-12-31: Celebrated the new year in _Paris_ with **Marie Curie**.\n- 2017-11-15: Talked to **George Washington Carver** on the phone for an hour.\n```\n\n- and an ordered list of all notes:\n\n```markdown\n### Notes:\n\n- 2018-06-15: **Grace Hopper** found out she's getting a big Naval Academy building named after her. @navy\n- 2017-06-06: **Marie Curie** just got accepted into a PhD program in _Paris_. @school\n```\n\nSee the example\n[`friends.md`](https://github.com/JacobEvelyn/friends/blob/main/friends.md)\nfile for more information.\n\n### Global flags\n\n`friends` supports several global flags that can be used on any command when\nspecified before the name of the command, like: `friends [flags] [command]`.\n\nThese flags are:\n\n- `--colorless`: Disable output colorization and other effects.\n- `--debug`: Debug error messages with a full backtrace.\n- `--filename`: Set the location of the friends file to use (default: `~/friends.md`).\n\n```bash\n$ friends --filename ./test/tmp/friends.md clean\nFile cleaned: \"./test/tmp/friends.md\"\n```\n\n- `--quiet`: Quiet output messages.\n\n```bash\n$ friends --quiet add activity Went rollerskating with George.\n$ # No output!\n```\n\nIn addition, these flags may be used without any command:\n\n- `--help`: Show the help menu. This is equivalent to `friends help`.\n  Help menus are available for all levels of commands:\n\n```bash\n$ friends --help\n```\n\n```bash\n$ friends list --help\n```\n\n```bash\n$ friends list activities --help\n```\n\n- `--version`: Show the `friends` program version.\n\n### Syncing across multiple machines\n\nWouldn't it be nice to be able to use `friends` across all of your\ndevices? Hooray, you can! Just put the `friends.md` file in your\nDropbox/Box Sync/Google Drive/whatever folder and use the\n`--filename` flag. You can even set up a Bash/Zsh/whatever alias to\ndo this for you, like so:\n\n```bash\nalias friends=\"friends --filename '~/Dropbox/friends.md'\"\n```\n\n### Setting reminders\n\nThough `friends` has no built-in reminder functionality, it's easy to use a\nsystem like `cron` (Mac or Linux) or `Task Scheduler` (Windows) to set various\nreminders.\n\nFor example, on a Mac, the following `crontab` configuration results in every day\nat 9:00 p.m. a Terminal tab opening, printing \"Time to journal!\" and then launching\nan `add activity` prompt through `friends`:\n\n```\n0 21 * * * osascript -e 'activate application \"Terminal\"' \u0026\u003e /dev/null \u0026\u0026 osascript -e 'tell application \"Terminal\" to do script \"clear \u0026\u0026 echo Time to journal! \u0026\u0026 friends add activity\"' \u0026\u003e /dev/null\n```\n\nHere's another example (also for Mac) of using `friends` to suggest some people to\nhang out with every Saturday morning:\n\n```\n0 10 * * 6 osascript -e 'activate application \"Terminal\"' \u0026\u003e /dev/null \u0026\u0026 osascript -e 'tell application \"Terminal\" to do script \"clear \u0026\u0026 echo Consider hanging out with one of these friends today: \u0026\u0026 friends suggest\"' \u0026\u003e /dev/null\n```\n\n(If you use other tools, please share and we'll add to these examples!)\n\n### Command reference\\*\n\n\\*Note that the command-line output is colored, which this README cannot show.\n\n#### `add activity`\n\n```bash\n$ friends add activity Got lunch with Grace and George.\nActivity added: \"2018-01-04: Got lunch with Grace Hopper and George Washington Carver.\"\n```\n\n`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_.\n\nNicknames will be used to match friends in activities,\njust like formal names:\n\n```bash\n$ friends add activity Invented debugging with The Admiral.\nActivity added: \"2017-01-06: Invented debugging with Grace Hopper.\"\n```\n\nYou can also use the first initial of a last name instead of the whole thing.\n`friends` will figure out what to do with those pesky periods (if you include\nthem) based on whether you're in the middle of a sentence or not:\n\n```bash\n$ friends add activity Got lunch with Earnest H and Earnest S. in the park. Man, I like Earnest H. but really love Earnest S.\nActivity 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.\"\n```\n\nAnd locations or their aliases will be matched as well:\n\n```bash\n$ friends add activity Went swimming near atlantis with George.\nActivity added: \"2017-01-06: Went swimming near Atlantis with George Washington Carver.\"\n$ friends add activity Had lunch in nyc with George.\nActivity added: \"2017-01-06: Had lunch in New York City with George Washington Carver.\"\n```\n\nTags will be colored if they're provided (though this README can't display\ncolor so you'll just have to have faith here):\n\n```bash\n$ friends add activity The office softball team wins a game! @work @exercise:sports\nActivity added: \"2017-05-05: The office softball team wins a game! @work @exercise:sports\"\n```\n\nYou can of course specify a date for the activity:\n\n```bash\n$ friends add activity Yesterday: Celebrated the new year with Marie.\nActivity added: \"2017-12-31: Celebrated the new year with Marie Curie.\"\n```\n\nOr get an **interactive prompt** by just typing `friends add activity`, with or without a date specified:\n\n```bash\n$ friends add activity 2018-11-01\n2018-11-01: \u003ctype description here\u003e\n```\n\n**Natural-language dates** work just fine:\n\n```bash\n$ friends add activity last Monday\n2017-03-07: \u003ctype description here\u003e\n```\n\nYou can escape the names of friends you don't want `friends` to match with a backslash:\n\n```bash\n$ friends add activity \"2018-11-01: Grace and I went to \\Martha's Vineyard. \\George had to cancel at the last minute.\"\nActivity added: \"2018-11-01: Grace Hopper and I went to Martha's Vineyard. George had to cancel at the last minute.\"\n```\n\nAnd if an activity contains friends or locations you haven't yet added, you can simply\ndenote them with the signifiers found in the `friends.md` file (`**`s around friends,\nand `_`s around locations), and `friends` will automatically add the friends or locations\nthat are missing:\n\n```bash\n$ friends add activity \"2018-11-01: I got to meet **Oprah Winfrey** in _Chicago_ today.\"\nActivity added: \"2018-11-01: I got to meet Oprah Winfrey in Chicago today.\"\nFriend added: \"Oprah Winfrey\"\nLocation added: \"Chicago\"\n```\n\nThis is really handy for when you have an activity involving a friend or location that\nyou can't remember if you've already added. Just use the signifiers and\nthey'll be added if necessary!\n\n##### Setting a default location\n\nWhen 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:\n\n```bash\n$ friends add activity Took a plane to Paris\nActivity added: \"2020-01-04: Took a plane to Paris\"\nDefault location set to: \"Paris\"\n$ friends add activity Ate lunch at a charming café\nActivity added: \"2020-01-04: Ate lunch at a charming café\"\n$ friends add activity Left the city to go to Chamonix\nActivity added: \"2020-01-04: Left the city to go to Chamonix\"\nDefault location set to: \"Chamonix\"\n```\n\n```bash\n$ friends list activities --in Paris\n2019-01-04: Ate lunch at a charming café\n2019-01-04: Took a plane to Paris\n```\n\n#### `add note`\n\nNotes can be added exactly like activities, either on one line:\n\n```bash\n$ friends add note Yesterday: Marie got accepted into a PhD program\nNote added: \"2017-12-31: Marie Curie got accepted into a PhD program\"\n```\n\nOr with a prompt:\n\n```bash\n$ friends add note last Monday\n2017-03-07: \u003ctype description here\u003e\n```\n\nAnd just like with `add activity`, dates, friends, locations, nicknames, and tags will all be\nintelligently matched. In addition, as with `add activity` you can use the `**`/`_` signifiers\naround friend and location names and they'll be added if necessary:\n\n```bash\n$ friends add note \"2018-11-01: **Oprah Winfrey** grew up in _Chicago_.\"\nActivity added: \"2018-11-01: Oprah Winfrey grew up in Chicago.\"\nFriend added: \"Oprah Winfrey\"\nLocation added: \"Chicago\"\n```\n\nThis is really handy for when you have a note involving a friend or location that\nyou can't remember if you've already added. Just use the signifiers and\nthey'll be added if necessary!\n\n#### `add friend`\n\n```bash\n$ friends add friend Grace Hopper\nFriend added: \"Grace Hopper\"\n```\n\n#### `add tag`\n\n```bash\n$ friends add tag Grace Hopper science\nTag added to friend: \"Grace Hopper @science\"\n```\n\n#### `add location`\n\n```\n$ friends add location Atlantis\nLocation added: \"Atlantis\"\n```\n\n#### `add nickname`\n\n```bash\n$ friends add nickname \"Grace Hopper\" \"The Admiral\"\nNickname added: \"Grace Hopper (a.k.a. The Admiral)\"\n$ friends add nickname \"Grace Hopper\" \"Amazing Grace\"\nNickname added: \"Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace)\"\n```\n\n#### `add alias`\n\n```bash\n$ friends add alias \"New York City\" \"NYC\"\nAlias added: \"New York City (a.k.a. NYC)\"\n$ friends add alias \"New York City\" \"Big Apple\"\nAlias added: \"New York City (a.k.a. NYC a.k.a. Big Apple)\"\n```\n\n#### `clean`\n\nReads and re-writes the `friends.md` file:\n\n```bash\n$ friends clean\nFile cleaned: \"~/friends.md\"\n```\n\nThis command is useful after manual editing of the file, for re-ordering its\ncontents and adding any missing friends or locations that are found in\nactivities or notes. Note that `friends clean` is automatically called after\nthe editor in `friends edit` is closed.\n\n#### `edit`\n\nAllows you to manually edit the file:\n\n```bash\n$ friends edit\nOpening \"~/friends.md\" with \"vim\"\n```\n\nThe file is opened with the command specified by the `EDITOR` environment\nvariable, falling back to `vim` if it is not set:\n\n```bash\n$ export EDITOR='atom --wait'\n$ friends edit\nOpening \"~/friends.md\" with \"atom --wait\"\n```\n\nNote that when setting your own `EDITOR` value, if you like to use\nan editor like Atom, VS Code, or Sublime Text, you should first make\nsure you have the command-line tool for your editor (`atom`, `code`,\nor `subl`) installed correctly so you can open your editor from the\ncommand line. Then, when setting `EDITOR`, make sure to use the\n`--wait` flag (as in the example above), which will allow `friends`\nto be able to run the `clean` command (see below).\n\nAfter the editor has been closed, `friends` will automatically run the\n`clean` command to re-organize the file and add any friends or locations\nyou've referenced in activities or notes that have not been added to the\nfile. This means that, similar to the `add activity` and `add note`\ncommands, you can add lines like:\n\n```markdown\n- 2018-01-01: I just met **Oprah Winfrey** in _Chicago_!\n```\n\nAnd if that friend or location isn't already present it'll be added:\n\n```bash\nFriend added: \"Oprah Winfrey\"\nLocation added: \"Chicago\"\nFile cleaned: \"~/friends.md\"\n```\n\n#### `graph`\n\nGraphs (in color!) your activities over time:\n\n```bash\n$ friends graph\nFeb 2018 |██████∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |████████████████████\nDec 2017 |███∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |█████████∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nBy default, graphs are scaled relative to the month with the most activities.\nYou can also show the unscaled graph:\n\n```bash\n$ friends graph --unscaled\nFeb 2018 |██\nJan 2018 |███████\nDec 2017 |█\nNov 2017 |███\n```\n\nYou can graph only activities with a certain friend:\n\n```bash\n$ friends graph --with George\nFeb 2018 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |█████████████████∙∙∙|\nDec 2017 |███∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |██████∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nThe dots represent the total activities of each month, so you can get a feel for the\nproportion of activities with that friend vs. the total you've logged.\n\nYou can also graph a certain group of friends:\n\n```bash\n$ friends graph --with George --with Grace\nFeb 2018 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |███████████∙∙∙∙∙∙∙∙∙|\nDec 2017 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |███∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nOr graph only activities with a certain tag:\n\n```bash\n$ friends graph --tagged food\nFeb 2018 |██████∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |█████████∙∙∙∙∙∙∙∙∙∙∙|\nDec 2017 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nOr with multiple tags:\n\n```bash\n$ friends graph --tagged fun --tagged work\nFeb 2018 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |█∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nDec 2017 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |█∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nOr graph only activities in a certain location:\n\n```bash\n$ friends graph --in Paris\nFeb 2018 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nDec 2017 |███∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nOr graph only activities on or after a certain date:\n\n```bash\n$ friends graph --since 'January 21st 2018'\nFeb 2018 |███████∙∙∙∙∙∙∙∙∙∙∙∙∙|\nJan 2018 |█∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nOr graph only activities before or on a certain date:\n\n```bash\n$ friends graph --until 'January 1st 2018'\nJan 2018 |█████████████∙∙∙∙∙∙∙|\nDec 2017 |███∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙|\nNov 2017 |█████████∙∙∙∙∙∙∙∙∙∙∙|\n```\n\nAnd you can use multiple of these flags together:\n\n```bash\n$ friends graph --unscaled --in Paris --tagged food --with George --since 'Jan 2018'\nJan 2018 |∙∙∙∙∙∙∙|\nFen 2017 |█∙∙∙∙|\n```\n\n#### `help`\n\nDisplays a help menu. This is equivalent to `friends --help`.\n\n```bash\n$ friends help\nNAME\n    friends - Spend time with the people you care about. Introvert-tested. Extrovert-approved.\n\nSYNOPSIS\n    friends [global options] command [command options] [arguments...]\n\n...\n```\n\nHelp menus are available for all levels of commands:\n\n```bash\n$ friends help\n```\n\n```bash\n$ friends help list\n```\n\n```bash\n$ friends help list activities\n```\n\n#### `list activities`\n\nLists recent activities:\n\n```bash\n$ friends list activities\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop\n2017-11-15: Talked to George Washington Carver on the phone for an hour.\n```\n\nYou can list the activities you did with a certain friend:\n\n```bash\n$ friends list activities --with George\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n2017-11-15: Talked to George Washington Carver on the phone for an hour.\n```\n\nOr only activities done with a group of friends:\n\n```bash\n$ friends list activities --with George --with Grace\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n```\n\nOr filter your activities by location:\n\n```bash\n$ friends list activities --in \"New York\"\n2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop\n```\n\nOr by tag:\n\n```bash\n$ friends list activities --tagged food\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n```\n\nOr use more than one tag:\n\n```bash\n$ friends list activities --tagged fun --tagged work\n2018-07-04: Summer picnic with @work colleagues. @fun\n```\n\nOr by date:\n\n```bash\n$ friends list activities --since 'December 31st 2017'\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop\n```\n\n```bash\n$ friends list activities --until 'December 31st 2017'\n2017-12-31: Celebrated the new year with Marie Curie in New York City. @partying:ball-drop\n2017-11-15: Talked to George Washington Carver on the phone for an hour.\n```\n\nAnd you can mix and match these options to your heart's content:\n\n```bash\n$ friends list activities --tagged food --with Grace --with George\n2018-01-04: Got lunch with Grace Hopper and George Washington Carver. @food\n```\n\n#### `list notes`\n\nYou can list notes the same way you list activities:\n\n```bash\n$ friends list notes --tagged school --with Marie\n2017-03-12: Marie Curie completed her PhD in record time. @school\n2015-06-06: Marie Curie just got accepted into a PhD program in Paris. @school\n```\n\n#### `list friends`\n\nLists all of your friends in alphabetical order:\n\n```bash\n$ friends list friends\nGeorge Washington Carver\nGrace Hopper\nMarie Curie\n```\n\nOr you can choose to sort by number of activities:\n\n```bash\n$ friends list friends --sort n-activities\n2 activities: George Washington Carver\n2 activities: Grace Hopper\n1 activity: Marie Curie\n```\n\nOr by most recent activity:\n\n```bash\n$ friends list friends --sort recency               \n7 days ago: Grace Hopper\n308 days ago: George Washington Carver\n312 days ago: Marie Curie\n```\n\nAnd you can reverse the sorting at any time:\n\n```bash\n$ friends list friends --sort n-activities --reverse\n1 activity: Marie Curie\n2 activities: Grace Hopper\n2 activities: George Washington Carver\n```\n\nYou can also include friend nicknames, locations, and tags:\n\n```bash\n$ friends list friends --verbose\nGeorge Washington Carver\nGrace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris] @navy @science\nMarie Curie [Atlantis] @science\n```\n\nYou can filter your friends by location:\n\n```bash\n$ friends list friends --in Paris\nMarie Curie\n```\n\nAnd you can also filter your friends by tag:\n\n```bash\n$ friends list friends --tagged science\nGrace Hopper\nMarie Curie\n```\n\nYou can even use more than one tag to further narrow down the list:\n\n```bash\n$ friends list friends --tagged science --tagged navy\nGrace Hopper\n```\n\n#### `list tags`\n\nLists all tags you've used, in alphabetical order:\n\n```bash\n$ friends list tags\n@dancing\n@food\n@school\n@swanky\n```\n\nYou can limit this to only tags from activities:\n\n```bash\n$ friends list tags --from activities\n@dancing\n@food\n@swanky\n```\n\nOr only tags from friends:\n\n```bash\n$ friends list tags --from friends\n@school\n@swanky\n```\n\nOr only tags from notes:\n\n```bash\n$ friends list tags --from notes\n@navy\n@school\n```\n\nOr only tags from two out of three:\n\n```bash\n$ friends list tags --from activities --from friends\n@dancing\n@food\n@navy\n@school\n@swanky\n```\n\n#### `list locations`\n\nLists all of the locations you've added, in alphabetical order::\n\n```\n$ friends list locations\nAtlantis\nNew York City\nParis\n```\n\nOr you can choose to sort by number of activities:\n\n```bash\n$ friends list locations --sort n-activities\n1 activity: New York City\n1 activity: Paris\n0 activities: Atlantis\n```\n\nOr by most recent activity:\n\n```bash\n$ friends list locations --sort recency  \nN/A days ago: Atlantis\n7 days ago: New York City\n312 days ago: Paris\n```\n\nAnd you can reverse the sorting at any time:\n\n```bash\n$ friends list friends --sort n-activities --reverse\n0 activities: Atlantis\n1 activity: Paris\n1 activity: New York City\n```\n\nYou can also include location aliases:\n\n```bash\n$ friends list locations --verbose\nAtlantis\nNew York City (a.k.a. NYC)\nParis\n```\n\n#### Advanced searching\n\nSince `friends` is a command-line program, we can easily support\nmore complex searching by piping the output of a `list` command\nthrough a command-line tool like `grep`.\n\nFor instance, to see all of the notes containing the string `PhD`:\n\n```bash\n$ friends list notes | grep PhD\n2017-07-01: Marie Curie just got accepted into a PhD program.\n2017-06-10: John Doe is finishing his PhD.\n2013-06-10: John Doe is just starting his PhD.\n```\n\nAnd you can combine this with the normal filter options provided\nby `friends`, like this:\n\n```bash\n$ friends list notes --with John --since 'January 1st 2015' | grep PhD\n2017-06-10: John Doe is finishing his PhD.\n```\n\nNote that `grep` has some handy flags, like `--ignore-case`/`-i`, and\n`--color=always`, to help customize your search:\n\n```bash\n$ friends list notes --with John --since 'January 1st 2015' | grep -i PhD\n2017-06-10: John Doe is finishing his PhD.\n2016-06-01: I think John Doe is hoping to finish his phD about a year from now.\n```\n\nThese `grep` flags might be slightly different depending on which version of\n`grep` you have installed.\n\n#### `remove tag`\n\nRemoves a specific tag from a friend:\n\n```bash\n$ friends remove tag Grace Hopper fun\nTag removed from friend: \"Grace Hopper (a.k.a. Amazing Grace) @OtherTag\"\n```\n\n#### `remove nickname`\n\nRemoves a specific nickname from a friend:\n\n```bash\n$ friends remove nickname \"Grace Hopper\" \"The Admiral\"\nNickname removed: \"Grace Hopper (a.k.a. Amazing Grace)\"\n```\n\n#### `remove alias`\n\nRemoves a specific alias from a location:\n\n```bash\n$ friends remove alias \"New York City\" \"Big Apple\"\nAlias removed: \"New York City (a.k.a. NYC)\"\n```\n\n#### `rename friend`\n\n```bash\n$ friends rename friend \"Grace Hopper\" \"Grace Brewster Murray Hopper\"\nName changed: \"Grace Brewster Murray Hopper (a.k.a. Amazing Grace)\"\n```\n\nThis will update that friend's name in all notes and activities.\n\n#### `rename location`\n\n```bash\n$ friends rename location Paris \"Paris, France\"\nLocation renamed: \"Paris, France\"\n```\n\nThis will update that location's name in all notes and activities.\n\n#### `set location`\n\nSets a friend's location:\n\n```bash\n$ friends set location Marie Paris\nMarie Curie's location set to: Paris\n```\n\n#### `stats`\n\nGives you your lifetime usage stats:\n\n```bash\n$ friends stats\nTotal activities: 4\nTotal friends: 3\nTotal locations: 3\nTotal notes: 4\nTotal tags: 5\nTotal time elapsed: 848 days\n```\n\n#### `suggest`\n\nGives you suggestions of up to three random friends to do something with, based\non how often you've done things with them in the past:\n\n```bash\n$ friends suggest\nDistant friend: Marie Curie\nModerate friend: Grace Hopper\nClose friend: George Washington Carver\n```\n\nYou can request suggestions of friends in a specific location:\n\n```bash\n$ friends suggest --in Paris\nDistant friend: Marie Curie\n```\n\n#### `update`\n\nUpdates `friends` to the latest version on RubyGems:\n\n```\n$ friends update\nUpdated to friends 0.17\n```\n\n## Other documentation\n\nIn case you're _really_ interested, we have documentation on\n[RubyDoc](http://www.rubydoc.info/github/JacobEvelyn/friends).\n\n## Contributing (it's encouraged!)\n\nIf you have an idea,\n[make a GitHub issue](https://github.com/JacobEvelyn/friends/issues/new)!\nSuggestions are very very welcome, and usually are implemented very\nquickly. And if you'd like to do the implementing yourself, see the\n[contributing guide](https://github.com/JacobEvelyn/friends/blob/main/.github/CONTRIBUTING.md).\n\nA big big thanks to all of this project's lovely\n[contributors](https://github.com/JacobEvelyn/friends/graphs/contributors):\n\n\u003ca href=\"https://github.com/JacobEvelyn/friends/graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/friends/contributors.svg?width=890\" /\u003e\u003c/a\u003e\n\nAnother way to contribute is to make a donation with the **Sponsor** button at the top of this page!\n\n### Backers\n\nThank you to all backers! 🙏 [[Become a backer](https://opencollective.com/friends#backer)]\n\n\u003ca href=\"https://opencollective.com/friends#backers\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/backers.svg?width=890\"\u003e\u003c/a\u003e\n\n### Sponsors\n\nSupport 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)]\n\n\u003ca href=\"https://opencollective.com/friends/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/friends/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/friends/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n## Code of Conduct\n\nNote that this project follows a [Code of Conduct](https://github.com/JacobEvelyn/friends/blob/main/CODE_OF_CONDUCT.md).\nIf you're a polite, reasonable person you won't have any issues!\n\n## License\n\nFriends is released under the\n[MIT License](https://github.com/JacobEvelyn/friends/blob/main/LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacobevelyn%2Ffriends","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacobevelyn%2Ffriends","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacobevelyn%2Ffriends/lists"}