A Life System
I’ve been noodling on this: lots of things, like a weird amount of things, can be formatted such that a columnar database is a good way to represent those things.
For example:
- Health statistics
- Photos (well, metadata really, but also links to or blobs containing photos)
- Finances
- Blog posts
- Daily notes
- Timesheet
- Reading lists
- Bookmarks
I’ve been using the following tools for these things:
- Health statistics: Garmin Connect
- Photos (+ metadata): SmugMug
- Finances: Google Sheets (and bank statements)
- Blog posts: markdown files + a bash script to translate to HTML
- Daily notes: Obsidian
- Timesheet: A custom file format + Ruby code to parse and display
- Reading lists: Obsidian
- Bookmarks: Firefox (and, historically, Pinboard)
But…what about consolidating all of this into one place? I have frustrations with most of the above tools - too online, too restrictive, not restrictive enough, requires a heavy client app to run, etc. I’m a software engineer: why not create a series of tools to build and maintain a database, ingest data periodically, and display in some controlled way. (I’m describing an ETL system. It’s an ETL system.)
If you generalize, and I love to generalize, there are four functions:
- Define and maintain a set of database tables. Rails’ migration system is pretty close - a database with a table defining the version that’s tied to files somewhere - but the actual change scripts would be raw SQL. (Postgres 4 lyfe, baby!)
- Fetch data and put it into the database tables. Hit an API, query the Firefox SQLite DB, collect console input, etc. I’d imagine this is a directory - the tool name - that contains an entry point and any supporting scripts.
- Display the data in the database tables. Probably the same deal using the above directories; output HTML, send data to a server with rsync, output something on the CLI, that kind of thing.
- The entry point; maybe a lightweight web server or CLI script that knows the on-disk format of the tools and can navigate through them.
Maybe something like this:
$ lifetool <subsystem> <action> <args>
Where <subsystem>
is things like “finance”, “health”, “bookmarks”, etc. If it
were “finance”, actions would be “transaction” (with args “expense food 10.00
taco bell” for a $10 transaction categorized as food from Taco Bell) or
“summarize” (giving you that week/month/year of totals). Or “lifetool health
update” to out to the Garmin Connect API and pull in that day’s health stats.
“blog this-is-a-post-name” would open vim to the right place to start a post.
Additionally, subsystems would have well-defined housekeeping actions (“migrate”
comes to mind) they must implement. The CLI isn’t the best way to get some data
in, so there would be web interfaces as well. But ultimately it’s all just
building databases tables, dumping data into those tables, and displaying data
in those tables. The tables representing stuff in my life.
I feel like this must have been built before, right? How do you even Google around for this? “Life database management tooling”?
Whatever, sounds like a job for bash.