This isn't what I expected from the headline (i.e. notetaking software), and it's not something I could ever see myself using, but I really do like the design (and your answers here).
The human-readable (Markdown) database format is clever. The friend identification algorithm is simple and elegant and sounds pretty effective. And the natural language input format.
Every one of these decisions is "bad" in the sense that they aren't perfect or could cause problems down the line, but it seems like they all work just fine for the intended purpose. So let me suggest that more designers and developers consider the scope/scale of their problems and try to choose simpler options (even "hacks") when they make sense.
And re: the post title, thanks for the tip—it seems "journal" has even more meanings than I thought! I wanted to avoid "diary," which in my experience often has childish connotations. Perhaps the awkward-sounding "friendship log" is the best descriptor...
I know a former dean who essentially had a system like this custom made for himself 20 years ago. He said it saved his skin several times, and may have saved the school itself on more than one occasion. This is not for tinder kids. This for CEOs.
I like the idea behind this, pretty cool. I'm wondering about this though.
> 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.
How does this work? For example, if I have two equally good friends named "Grace", how can "friends" guess which one I'm talking about?
Great question. Since the friends.md only stores friend names and activities, we have to be a bit creative in how we figure this out.
Currently, it looks at all of the past activities and in particular how often groups of friends appear together. For instance, if my activity is:
"Grabbed burgers and fries with Grace and George."
It will pick the "Grace" and "George" that appear most often together. In the case of a tie, or when there is only one name to match, it picks the ones who are closer friends (which for our purposes means they've been in more activities).
This works even for large groups, and it will brute-force every combination of all of the names with multiple friend matches to find the set with the highest score (based on pairs of friends, so a group of 10 friends will be matched correctly even if no activity has yet had exactly those 10 friends together). The brute force algorithm hasn't been slow enough to warrant any sort of constraint satisfaction optimization.
I've found this algorithm to work almost every time, because I find I usually refer to people (verbally and mentally) in groups ("Mark, Jane, and Stacy from work," "Jack and Jill's wedding," etc.), or use last names when I have more than one friend with a given first name and the one I'm referring to isn't the one I'm closest with (e.g. "Grace" would refer to my close friend Grace Hopper, while I might say "Grace Kelly" to refer to my acquaintance to clarify that it's not Grace Hopper).
I'm interested in ways to make this smarter still though, and/or better UX to allow the user to correct mistakes. Very interested in suggestions here if you have any!
This is really neat! I've been thinking about ways to better stay in touch with friends and this might help. Right now it appears to be mostly about activity logging. I did see the "suggest" feature and I think that could be a point of expansion.
Simular to your own thinking, the "suggest" feature is why I built this in the first place, but sadly it has gotten the least amount of love because I had to first build the foundation so it would have friends to suggest in the first place.
If you have any suggestions (heh) for how to improve/expand upon this feature, I'm all ears!
I can't tell if this is a serious comment or not but I've used this app as a very lightweight journal for the past year and I've recorded 457 activities (most are just a few words) featuring 165 friends (though many are only acquaintances).
Mostly posting these stats because it was interesting for me to count them and see for myself. :)
I'm not totally sure what you mean by "profiles," but you can see all of the activities you've done with a friend like this: `friends list activities --with 'Grace Hopper'` and you can see a graph of your relationship over time with: `friends graph 'Grace Hopper'`
I suspect by "profile" you really mean what the second question is getting at around storing more information. I haven't committed to anything in particular in that vein and I like how this program is currently very lightweight UX-wise. (I want it to encourage users/me to be social and maintain relationships offline.) That being said, I've been thinking a lot about lightweight ways to intelligently incorporate location data as well, so that (for example) if I'm visiting a city for a weekend I could query for friends in that city to do things with.
Do you have other ideas? I'm very very open to suggestions!
Good question. That command is just a thin wrapper around `gem update`. It's just a personal thing where I prefer it when command-line programs tell me how they update instead of having to remember whether I installed them via npm or rubygems or homebrew or pip or as a downloaded binary, etc.
Are there annoyances with having an update command like this?
On platforms that don't have a package manager a self-update might make sense. I think in your case you should just remove that bit of code. Imagine if every Python/Rust/Ruby/Go tool had a self-update function. They don't need it, let it be managed by your platform package manager such as gem or your distribution's.
I'm not sure which way I lean, but I suppose there are two camps/use cases here:
1) People who regularly use one or a couple of package managers who can update all packages with a few commands.
2) People who regularly use packages from a variety of many different package managers, for whom running `update` for each one would be more cumbersome than just running updates on the packages themselves.
I don't know which way I lean, but I don't see the harm in having a self-update in the package so long as you can also update via gem, but maybe I'm way off-base.
I have found it pretty useful in tracking the ones I deal with more substantively but one use case I have had trouble dealing with is in initial encounters and deciding whether it is even worth the effort of adding a new recruiter to my app. I get enough recruiter spam that the cost of simply filling in the form on my app to add each recruiter could be prohibitive. Nevertheless, I'd like to keep a record with any recruiter I deal with, even if it is just spam or template email.
I currently have a de-facto solution that involves the autocomplete feature in Gmail search and Mailchimp mailing lists. But I can see this solving this problem much more neatly and coherently. And as a Ruby gem, I could imagine even integrating it with my Rails app.
Thanks! I'd love to hear how well/poorly this integrates with your (very cool) app. Do feel free to create GitHub Issues if there are things you think should be changed to allow easier interoperability.
In particular I'd love to hear how this works as a standalone Ruby library (the `Introvert` class should help you more directly than the shell commands), since I tried to separate the internals from the command-line interface (which is in bin/friends) but I think that separation is somewhat blurred at the moment.
I am not a psychologist, but i ever had a consultation. I felt so lonely, so empty, and i didn't know what to do (i was in college at that time). She tried to gather more information from me. Ended up she gave a suggestion to do something like this journal: I had to make an intense communication, with 20 different friends, for two weeks. I also needed to write the gist of activities to be reported to her.
After two weeks, she was disappointed because i failed to reach the goal. I was able to get intense communication to only three of my friends. But i got my problem right: All of these empty feeling was because i didn't have enough interaction with other.
I didn't have adequate evidence that i was that lonely. By writing a journal, i knew that i barely made sufficient interaction with other; far below the threshold.
# how to deal with people who live far away (can't meet regularly but are important):
$ friends add Sister
$ friends add Brother-in-Law
Activities for future date Store an idea for an activity and remind yourself in the future.
Location sensitive friends - Don't remind me of friends in New York when I live in LA. Similarly, if I am visiting my mom in Toronto, remind me of friends living in Toronto. I know facebook and similar services attempt to do something like this.
Thanks for the feedback! These are both great things to bring up and also both on my mind. Couples already work fairly well as individuals because of the way "John and Martha" will be matched to "John Smith" and "Martha Smith," but it's definitely worth thinking about whether it makes sense to join them formally somehow.
Locations is one of the next big areas I'd like this to incorporate, but many of my ideas are fuzzy so any thoughts are (as always) appreciated!
I have implemented and used a similar thing for many years. I think a very great virtue of such a system is that you can run a cronjob pretty easily to email you reminders to contact any friends you haven't poked at much.
And I have also thought about the process of making friends for many years.
Consider that the complex network which is considered the ego network (a la the sociologists) is really considered a complex network, just like the overall global social network: radical inequality in the degree structure, clustering and triangle formation, radical inequality in eigenvalues of adjacency matrix, critical percolation to a giant component, durability to random insult but not attack, synchronizability.
Therefore, it will seem in low-friendship times that a radical prioritization is needed and that the durability to random insult should be used to deal with deep friends only. However, the global structure of the ego net must be maintained also by weak friendships, and weak relations are of the utmost importance in doing anything (see Granovetter's work).
As for the operation of getting the friends, fifteen or twenty readings of K. Johnstone's Impro should suffice.
The human-readable (Markdown) database format is clever. The friend identification algorithm is simple and elegant and sounds pretty effective. And the natural language input format.
Every one of these decisions is "bad" in the sense that they aren't perfect or could cause problems down the line, but it seems like they all work just fine for the intended purpose. So let me suggest that more designers and developers consider the scope/scale of their problems and try to choose simpler options (even "hacks") when they make sense.