Workbench Workbench
Archive
  • On Strangler Vines and Laptops: Notes Toward a Reclamation of the Personal Computer

    For a very long stretch of my career, with a brief sojourn into the vast corporate wilds, the professional and the personal grew tightly together. Strangler vines are to trees like my job is to my life. Maybe that’s a take too far, but the point I’m vaguely gesturing at is that there hasn’t been much distinction between the two.

    Well, truthfully, it was that work loomed much larger than my life and I oriented my career to allow my life to thrive in different ways. I’ve worked from glaciers, volcanos, Roman ruins, Byzantine catacombs, Minoan palaces, and taken meetings while wandering lost in a Costa Rican cloud forest. I was a single parent who brought my kid with me while I tried to have something that went beyond the paycheck. If I was going to work all the time I might as well live too.

    It has been a life of deliberate choices. The space between personal and professional became so blurred as to be indistinguishable. The work laptop became the personal laptop and for a decade long stretch, there was only an iPad (I never want to hear again that an iPad cannot be used for serious work). That was a choice. This summer I made another: to peel apart these two worlds.

    I bought myself a laptop.

    Don’t get too excited, it’s a 15” MacBook Air M5 with 32GB and a 512GB SSD. I’m (mostly) happily rooted inside their walled garden and this spec felt like the best balance of weight, size, power, portability, and more importantly, longevity. Apple makes quality hardware. The only downside is that the current state of things (hyperscalers, RAM shortages, The Strait of Hormuz, oh...well) meant it was a long 45 days from order to delivery, which reminded me of my father ordering a 40MB hard drive in ’82 and waiting some six months for its delivery. It had a very “collect two hundred cereal box tops and send them with a self-addressed and stamped envelope to a P.O. Box in Omaha, Nebraska to get something cool...someday” feeling.

    Setting this up has been a very interesting experience because there is nothing work about it. It’s a throwback to an earlier period when my time and energy and focus had clear boundaries, and the job didn’t come home. Hell, my job and personal life have been inseparably tangled, in some shape or form, for over 20 years. In my mind, there is this bright and sharp moment of before, before I became a portmanteau for Personal and Professional in a Hawaiian shirt. Before, when all my personal gear was messy, personalized, and very much mine. This feels like I’ve returned to that place.

    It isn’t just that Slack, Outlook, Excel, et al are missing or that I bring the apps I use most forward: IA Writer, iTerm2, Mindnode. This is my space. I don’t have notifications enabled because if my wife needs something she can lean over and ask. I use full screen more because there is only one thing to do at a time. I am here to be present, yet not productive. I can play more. I can experiment more. I can be more curious. I can be more myself.

    A week with this laptop has been meditative and reflective, which is a lot to ask of a piece of hardware. It is showing me something. Nudging me to linger and look. There is a glint on the horizon and it compels me to wander.


    Because sharing is caring, Context/Action on the CLI is my favorite thing...

    jameselwood ~/Personal/dotfiles (main)
    ❯
    

    Which is made possible by tucking this snippet into .zshrc...

    autoload -U colors && colors
    
    autoload -Uz vcs_info
    precmd() { vcs_info }
    zstyle ':vcs_info:git:*' formats ' %F{yellow}(%b)%f'
    
    setopt PROMPT_SUBST
    
    PROMPT='%F{cyan}%n%f %F{blue}%~%f${vcs_info_msg_0_}
    %F{green}❯%f '
    
    → 7:52 AM, Sep 29
  • Introducing Story Lantern

    The best projects are deeply personal. They solve something that has bothered you for years but has always remained just out of reach. My book collection is one of those things.

    I grew up in libraries. Not just the public library, which I frequented almost daily, but in a house whose walls were nearly covered with bookshelves, the books stacked two deep. Somehow my parents managed to keep a mental map of where each volume lay. There was little rhyme or reason that I could figure out. On those shelves, Russian literature mingled with slim philosophical tomes that stood with Victorian erotica, and atlases which crowded art books that shared space with The Whole Earth catalog. It could be bewildering to hunt for anything in that house. Yet if you asked them for something, no matter how vague ("What might you have on Pre-Colombian trade networks, especially focused on precious stones?") you’d receive back several books, each with torn slips of paper covered in hasty notes and slotted beside the relevant passages.

    My parents were not academics. My mother was a social worker and my father an engineer. They simply knew their library.

    Today, I've a similar problem. When I remarried, my daughter and I cleared out over 1,000 books to convert my office to a bedroom for my stepson. That was easy compared to the sprawl that is my digital collection: over 3,000 unread books, or 4,000+ if you include what I've read. With a physical collection you can arrange the map in space and time, using the texture of paper, color of jacket, position on the shelf, and even the room itself to locate what you are seeking.

    A physical library has a geography. The worn, warped, and faintly musty spines invite your fingers to slide down the shelf and brush against the garish colors of the pebbled book covers of small-press poetry collections. Round the atlas of rivers, overstuffed with full-color plates and causing a noticeable bow in the shelf, and you’ll find that short story collection about undocumented immigrants staying afloat in an uncaring US that you’d been hunting for.

    A digital collection, however, is so flat that it can be nearly impossible to navigate by feeling.

    Story Lantern is my attempt to recover the emotional aspects of navigating my collection using a system that classifies unread titles by fiction/non-fiction, mood, and thematic weight. It tries to make my large unread digital collection genuinely browsable.

    What it is built on

    I made some very conscious decisions to keep things compact and nimble, guided by a “Projects first. Learning follows.” mindset. For me, it is critical to park my CTO brain and focus on the joy and delight of following curiosity and building things explicitly for myself. I am not looking to scale a SaaS product or hunt for open windows in the market to leap through. It is also a very James-shaped project in that I am using things that are already well-worn patterns for me, like decades of Goodreads data.

    The Basic Stack

    • Goodreads
    • Google Books API
    • Python
    • SQLite
    • Ollama
      • qwen2.5:14b
      • phi4:14b
      • gemma3:12b

    Like all good software, it runs on the command line.

    How it works

    This is intentionally simple software:

    1. Ingest new books to the collection
    2. Update and classify the mood and weight of new books
    3. Get randomized book recommendations

    Since I am heavily into the Kindle ecosystem, I make use of Goodreads as the foundational data source because importing is as frictionless as Add Your Amazon Books. Judge me all you want but 3,000+ books in my pocket really is a dream for a person like me.

    Book data and classification are updated using both the Google Books API, which performs enough like abandonware that 503 may as well be its default HTTP response, and qwen2.5:14b for the mood and weight classifications.

    The results have been great...

    Total books:              3078
    Fiction/Non-Fiction:      3078 (100.0%)
    Mood classified:          3078 (100.0%)
    Descriptions:             3078/3078 (100.0%)
    Reactions:                26 (interested 21 / pass 4 / started 1)
    
    Mood confidence breakdown:
      high     2708
      medium   249
      low      8
      manual   113
      total    3078
    

    The intent of all this wasn't to build yet another book database. The point is to recover the emotional experience of the collection. I want to find that wonderment I had as a child, watching my parents hunt and select volumes in a seemingly haphazard manner while somehow remaining so decisive and opinionated. I want something that can help me navigate my emotional landscape, show me the best places to rest, and point toward the views worth struggling to reach. I want to be surprised by what surfaces.

    This is the fun part of playing with local models: you can sprinkle personality into what normally would be a random number generator. To help me surface books, I've created a persona of a haunted librarian who wants to share the treasures scattered throughout my library. They are a little odd and prone to get lost in their thoughts, but each volume they pull from the shelf carries an echo of what it was like to have my folks give me the backstory on how they acquired the copy or where they were when they first read it. My father spoke in breathless and hushed tones about his German tutor in university each time he handled his physics books from that period. You could swear he just returned from a session with her. I'm trying to capture that.

    Running python3 lantern.py surprise will surface a book and tiny little tale...

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      The Secret Speech (Leo Demidov #2)
      Tom Rob Smith  ·  Fiction
      Tense / Propulsive  ·  Heavy
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
      This volume seems to have shifted its place; it
      was on the Russian history shelves just yesterday.
      The narrative moves with an unsettling
      quickness—it does not linger where one might wish
      it would. It concerns itself with a society
      fracturing after Stalin’s death, and the
      precarious position of families caught within that
      shift. One follows Leo Demidov as he navigates
      this landscape, where those in power are often
      found to be guilty. Perhaps today is suitable for
      an acquaintance with such complexities.
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
      [i]nterested / [p]ass / [s]tarted it / Enter to skip (i, p, s, ): i
    

    If that feels like it's too much, then slide back into your comfort zone with python3 lantern.py surprise --mood "Cozy / Warm".

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      Ruth
      Kate Riley  ·  Fiction
      Cozy / Warm  ·  Light
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
      This one is best read when you have an afternoon
      to give over entirely; it asks for quiet
      attention. The narrative moves at its own pace,
      circling around the central figure of Ruth and her
      place within a community that holds firm beliefs.
      One finds oneself considering the weight of those
      convictions alongside the subtle shifts in
      perception experienced by others—a perspective
      shared with Ron Charles, I believe. It is not a
      book to be rushed; it seems to prefer an unhurried
      reader.
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      Filtered by: mood: Cozy / Warm
    

    Where I'd like to take it

    I rarely read in random sequences. My TBR piles tend to form around whatever captures my interest.

    • How do the senses shape our perception of reality?
    • What is the deal with trilobites?
    • How does it feel to live as a woman in rural India?
    • I feel like I'm at the bottom of a dry well behind my house and the teenage neighbor stole my ladder.

    Sequencing these feelings and interests can be tough as energy and mood shift like weather patterns. Each book can push me deeper into an interest or blow me sideways into something shockingly new. How do I capture that?

    I want Story Lantern to reveal a path through that capriciousness. A map of clues I can follow toward what I need (burnout recovery!) or how I am feeling (curious but tired!). Each book should be able to alter the path, while leaving room for the books sliding laterally into the TBR from my daughter, wife, or some new curiosity I suddenly have to chase.

    I don't want a reading list. I want a reading journey that changes with me.

    What I’m really building is a way to ask my library a vague question and have it come back with three books tucked under its arm and a conspiratorial smile.

    → 7:48 PM, Aug 17
  • Hobbyist Before Hacker

    I don't think of myself as a technologist, which is often odd for people to hear me say given that I've been a CTO for nearly 20 years and have built my life on building and scaling engineering teams and software platforms. It comes down to how I see technology and how and why I work with it.

    All technology is a tool.

    All tools are a means to an end.

    Creativity and delight are the point.

    Realizing ideas and solving problems in creative ways is what delights me: that's my end game. I didn't grow up absorbed with tinkering on early home computing systems. Sure, I grew up with an IBM 8088 that at the time cost as much as a new car, but did I love using it? Did I relish writing code?

    No.

    It was a tool that could help me do what I wanted to do:

    • Word processor for writing stories
    • D&D campaigns managed in dBase III
    • Cakewalk for writing the most overwrought MIDI scores for a vampire game my best friend at the time never got past the notebook stage

    At some point, around the time I discovered the bass guitar and the thrill of 4-track recording for my personal brand of post-punk/jazz, I stopped using computers altogether. Computers and software weren't the tools I reached for when I wanted to create something, and I spent more than a decade completely away from computers and technology, so much so that I was actually surprised by the internet in the mid-90s.

    Coming back to computers wasn’t some great technological awakening. Mostly, I was bored at work. My CTO origin story is so pedestrian: I learned Visual Basic to literally not do my job (why do it if you can automate it). From there I discovered online communities of like-minded people who wanted to discuss art, books, and music. Soon I was deep in a hole of hacking on the Franklin eBookMan, writing tools to convert text files to SGML, running a private server for trading MP3s, using and building tools to manipulate the photos I had been taking with my first DSLR, and blogging about every aspect of it.

    Yet I don't see myself as a technologist. I bristle at the term hacker. None of them fit me well when I look in the mirror.

    I am a hobbyist with restless curiosity.

    → 6:29 AM, Aug 15
  • RSS
  • JSON Feed