The records I keep

The act of writing is my way of refining my thoughts. Drafting a thought in text let’s me see it and refine it.

My written notes usually fall into one of these groups:

  • Personal thoughts
  • Meetings records
  • Research
  • Scratch files (commands I run, lists of items for reference )
  • Logs for house, car, medical info, clothing sizes
  • Sometimes pictures of paper notes or sketches
  • Draft responses for emails or chat communication

I prefer to write in Markdown. I do use some Multi-Markdown syntax for tables and description lists.

The simplicity of plain text feels right to me. The file size is very small and batch editing is possible with some light shell commands. There are also no proprietary formats or software required.

Plain text documents are the best future proof format for your data. They are small and computers will always be able to read text files.

Old way

For the past 7 years I’ve been using an application called nvALT on the Mac.

The ability to quickly search/create new text files was awesome. I picked up the good habit of naming my thoughts by job and date very early on. nvALT allows full text searching of a folder of text files. Since my files were named consistently project - description - YYYY-MM-DD , I could search all files by project, date with quick visual feedback. This gives order to my madness that was ~3500 text files over the past 10 years. Long emails, pitches, responses to clients, meeting notes all were made in nvALT. TextExpander helped with the date and times.

Marked 2 is a beautiful app to help get these text files in a more shareable state. It renders your markdown with some well designed templates and allows exporting lots of formats. PDFs I found the most useful. Marked also allows writing custom themes with CSS to match your company brand.

If the going got real tough I could also launch into Sublime Text from Marked to do multi-line editing or regex find and replace operations.

I used this flow for 5-6 years:

nvALT to textfiles to Marked to PDF

These text notes were stored in a Dropbox folder and synced very reliably to the cloud.

Once in the cloud I used Editorial and later 1Writer on iOS for the text file creation and searching. I used TextExpander on iOS to keep the project and date names consistent.

There was one pretty big setback to this setup. Getting images meant storing those files somewhere and usually renaming them to not be whatever the default was. Keeping those images in the same directory was a pain. Referencing images in the iOS apps was more trouble that it was worth.

Apple Notes picked up some slack here. Media driven research started to pile up in the Notes app. It was easy to get media into these notes.

I started using Day One for memories and personal thoughts. I would put things that I wanted to look back on and remember; dates kids were born, happy things, sad things. Mostly private thoughts. I really like the design of the app and loved that you could drop an image and get things like the location and the weather from the time stamp. It felt good to capture a memory and look back at things. Day One also had apps on both iOS and macOS.

Times they are a changing

So what started off as a lean plain text setup had grown into a 7-app 3-service beast.

  • iCloud for Notes with images
  • Dropbox for plain text sync
  • DayOne for private thoughts with images, location, and weather

This was becoming all too much. DayOne announced they would be moving to a subscription based plan. Apple's Notes app's lack of Markdown support and not being able to export to my beloved Marked was another thorn in my side.

Brave new world

Enter Bear. I had put off trying this app for a while, mainly because of its monthly fee. However it is very pretty and I am a sucker for slick, native Mac text editing.

I spent a Saturday importing ~3500 notes into Bear as a test. I thought it would crap out on such a massive import. It did not. Next I tried searching. The speed was not as quick as nvALT but fast enough.

My nvALT naming scheme wasn't looking so hot in Bear's UI so I added a few tags. I was impressed how tag renaming could be done. It also handles dragging notes onto those tags in the sidebar. This sort of reorganization would have sent me to the command line in my old system. Every time I had a complaint with Bear I found a great solution on their community page

Next I became interested in image and file attachments. I started to export from Apple Notes and began to cry a little with the hundreds of images that I would need to move…and…oh my god Bear has a menu item to do this import for me! The Apple Notes to Bear import went great.

Meanwhile all of this was syncing to my iPhone super reliably with Bear via iCloud.

I deleted Apple Notes and 1Writer from my phone. On the Mac I was still able to launch text files directly into Marked 2 from Bear. The preserved any old themes I wanted to use. Bear allows me to bail at anytime by exporting all Notes in markdown and can put images and attachments in folders next to the files. Basically allowing me to go back to my old ways at any point with low effort.

Baby bear steps

I had dropped the need for 3 apps and 1 service and had a gorgeous replacement for my aging nvALT. I got bit by the bug and thought why not more. My sights turned to the last hold out; DayOne. I decided that Bear's monthly cost was justified if I removed the need to pay for DayOne's.

If I did this all my notes could live in one place. Only one problem, a DayOne problem.

The bad and the ugly

Bear offered a handy DayOne importer like they did for Apple Notes but DayOne did something I was very attached to. It tagged entries with location, weather, and timestamps automatically. Better yet it did this on macOs and iOS.

Bear did not give me location or weather on file creation. But text is text and locations and weather are just an api call away right?

I wanted to have the weather on journal entries but I wanted to be able to search by location and date. I would prefer the map view of DayOne but could settle for some sort of tag in Bear since the nested tag setup is robust and easy to rename if change was needed in the future.

I decided that my traditional YYYY_MM_DD setup for dates would work well as a nested tag. This would allow me to filter all journal entries by year, month, or day easily. Location would be neat if it was by city or some combination of city/state but a more practical tag was zip-code.

I was able to achieve both of these text results using Workflow on iOS. For weather forecast.io has a free API tier to get the weather for a location. Workflow is able to call the API and parse the result. I had to find smarter, more determined folks to help figure this out.

iOS software

Web APIs

Workflows

This workflow shortcut kicks off a new Bear journal entry with header data of weather and tags with lat/long value, zip code, and date time.

A journal entry is kicked off from my home screen and lands me in Bear a few seconds later with my location, weather, and title ready to go.

macOS software

Web APIs

Now for the my Mac setup. There isn't a macOS version of Workflow but we have UNIX and bash. I could just curl forecast.io for weather and you can trigger bash scripts from a TextExpander snippet. This lets me make a new note in Bear and type the snippet and the journal setup magic happens.

The trickiest part was getting the current location of my Mac. I eventually found a project called LocateMe which can be called from the shell and it will output lat and long values for your computer. This completed parity to match my iOS workflow.

I have Textexpander trigger a bash script that outputs plain text.

TextExpander snippet

Set contents to Shell Script.

#! /bin/bash
. ~/.bash_profile
. ~/Dropbox/bin/jstart.sh

jsStart.sh

Script on macOS - requires install and setup of LocateMe, forecast.io api key, and geonames.org api user.

  1. setup geonames.org api user
  2. install the LocateMe app & grant permissions when asked
  3. replace YOUR_USER_NAME_HERE with the genomes
  4. save file as jstart.sh if using TextExpander snippet above
#!/bin/bash
DATE=`date '+%Y/%m/%d'`
LAT="$(~/Dropbox/bin/LocateMe -f {LAT})"
LON="$(~/Dropbox/bin/LocateMe -f {LON})"
FULL_TIME=`date '+%Y-%m-%d %H.%M.%S'`
TITLE_TIME=`date '+%Y-%m-%d'`
ZIP="$(curl -s "https://api.geonames.org/findNearbyPostalCodesJSON?lat=$LAT&lng=$LON&username=YOUR_USER_NAME_HERE" | jq -j '[.postalCodes[].postalCode][1]')"

RESULT="$(curl -s "https://api.forecast.io/forecast/YOUR_API_KEY_HERE/$LAT,$LON" | jq -j '{temperature: .currently.temperature, summary: .currently.summary'})"

echo "journal-$TITLE_TIME"
echo ""
echo "#journal/date/$DATE"
echo "#journal/location/$ZIP"
echo ""
echo "Date: $FULL_TIME"
echo "Location: $LAT, $LON"
echo -n "Weather: "
echo -n $RESULT | jq -j '.temperature'
echo -n "F, "
echo -n $RESULT | jq -j '.summary'

Before and after

Setup Compare

Always tinkering

I've been using this setup for 6 months now and it is working great. I am extremely happy with the constant updates to Bear I have seen in this time. I have not found myself looking back on my old setup with rose colored glasses yet. The only lacking item is Multi-markdown support and custom export themes. This is okay since you can launch to Marked 2. It does stink that you can't then open in another text editor for multi-line edits and find and replace.

I wish I didn't have to maintain a bash script and an iOS workflow but editing those are easy enough and done rarely. Creating new journal entries does take several seconds but it isn't slower than DayOne was and I don't have to maintain a separate journal app.

I miss the map interface of DayOne but that could be a feature to Bear in the future or a side project to export journal notes to view on a map.

Bear is now syncing close to 4000 notes and ~800MB in attachments.