Blog

  • Audible’s new “Ask a Question” feature

    What is β€œAsk a Question”?

    Audible is quietly beta-testing β€œAsk a Question,” or as I can’t resist calling it, Q&Ai. This AI-driven helper answers your questions about plot points, character motivations, historical context, literary devices, and more. Tap the new Ask a Question button while the audiobook is playing and type or ask your question out loud. Answers appear instantly, so you never need to pause and search the web or rewind a chapter.


    First look at the landing screen

    Landing screen for Audible's 'Ask a Question' feature, titled 'Get instant insights', showcasing adaptation favorites like 'The Great Gatsby' and 'Romeo and Juliet' in a mobile app interface.

    The screen is titled Get instant insights and invites listeners to:

    Explore popular classics with Ask a Question [BETA] … Tap the button in your player while listening to these timeless works.

    Two curated rows are highlighted:

    Adaptation favourites
    The Great Gatsby (performed by Jake Gyllenhaal) and Romeo and Juliet: The Folger dramatised audio edition are each available for one credit.

    Celebrity performances
    Dracula (performed by Alan Cumming and Tim Curry), Little Women (performed by Laura Dern), and Les MisΓ©rables (translated by Julie Rose) are offered as a mix of titles included with membership and options that cost one credit.

    Additional classics populate the carouselβ€”Tom Sawyer, Huckleberry Finn, The Odyssey, The Iliad, Meditations, A Book of Five Rings, The Count of Monte Cristo, Northanger Abbey, and selections from Dickens and Beatrix Potter. Modern best sellers are absent; for now the beta is limited to public-domain or long-established works, likely to minimize spoiler risks and copyright complexity.


    How it works in practice

    Screenshot of the Audible audiobook player displaying 'Dracula' performed by Alan Cumming and Tim Curry. The screen features a 'Get instant answers as you listen' message and an 'Ask a Question' button, along with playback controls.
    1. Start any supported audiobook from the curated list.
    2. Tap β€œAsk a Question” in the player.
    3. Type or dictate your query. Examples:
      • Why does Gatsby call Nick β€œold sport”?
      • What historical events framed Victor Hugo’s writing of Les MisΓ©rables?
    4. Read the reply without leaving the app. The answer stays onscreen while playback continues.

    I tested it with Dracula by asking, “How did Dracula know Jonathan Harker would arrive at the hostel, and why does that moment matter?”

    The AI answered in about 1 second: “Dracula arranged Jonathan’s arrival by sending a letter to the Golden Krone Hotel in Bistritz. This moment is significant because it reveals Dracula’s careful planning and manipulation. He deliberately orchestrated Jonathan’s journey, ensuring he would arrive on St. George’s Eve when evil powers are strongest. The innkeeper’s fear and the elderly woman’s warning about this date foreshadow the danger awaiting Jonathan. This scene establishes Dracula’s cunning nature and supernatural influence, while also introducing the novel’s Gothic atmosphere of dread and helplessness as Jonathan unwittingly proceeds toward his captor’s trap.” A thumbs-up or thumbs-down prompt followed, along with a caution that answers may be inaccurate or include spoilers.

    Early impressions

    Strengths

    • Clarity: answers are short, sourced, and spoiler-aware.
    • Convenience: no switching to a browser means fewer distractions.
    • Performance: latency is negligible; faster than Dracula turning into mist.

    Limitations

    • Catalog scope: only classics so far.
    • Depth: nuanced literary analysis sometimes feels surface-level.
    • Citations: the beta lists chapter numbers, not full references.

    Overall, it already beats pausing to search Stack Exchange or Wikipedia. If Audible widens the catalog and deepens the commentary, it could become a staple for students and casual readers alike.


    What I hope to see next

    • Contemporary titles with author-approved Q&A scopes
    • Richer sourcing (edition, translator, narrator) for academic citation
    • Context-aware follow-ups so the AI remembers the thread of questions
    • Accessibility support for visually impaired users who rely on voice input

    Try it yourself

    The beta is rolling out gradually in the latest Audible app (iOS and Android, July 2025 build). Look for the banner on the home screen, download one of the featured classics, and pose a question mid-chapter. Share your resultsβ€”I will gather feedback and post a follow-up review next week.


    AI assistance acknowledgement
    This post was drafted by the author, refined with generative-AI suggestions, and finalised after human review and editing.

  • Understanding Cursor AI’s pricing plans

    Recently, I was chatting with a colleague about our shared use of Cursor, the AI-native coding environment that’s been generating a lot of buzz. We both enjoy the productivity boost it offers, but the conversation took a turn when we started wondering about usage-based costsβ€”and whether we were truly in control of them.

    I first discovered Cursor through The AI Daily Brief, a curated newsletter I’ve come to trust for quality updates in the AI space. Intrigued, I signed up for the $20/month Pro plan, which seemed like a fair price for what Cursor claimed to offer.

    But over time, I started to ask: What does that $20 really include? And more importantly, could I accidentally rack up extra charges without realizing it?

    Image showing the pricing plans for Cursor: Hobby plan for free, Pro plan for $20/month with extended limits, unlimited completions, and access to additional features, and Ultra plan for $200/month with enhanced usage and priority access.
    Overview of Cursor’s individual pricing plans: Hobby, Pro, and Ultra, highlighting features and costs.

    Breaking down the pricing

    Cursor’s pricing documentation is fairly transparent. Here’s a summary of what the Pro plan offers:

    • Unlimited tab completions (for GitHub Copilot-style interactions)
    • Access to BugBot and Background Agents
    • Extended usage limits on all supported models

    Most importantly, you get over $20 of agent model inference per month at API pricing. That translates roughly to:

    • ~225 Sonnet 4 requests
    • ~550 Gemini requests
    • ~650 GPT-4.1 requests

    Heavier models like Claude Opus 4 burn through your budget faster. Cursor recommends being intentional about which agent you use. Also, consider when to use them.

    Once you hit your monthly limit, you’re presented with clear options:

    1. Switch to Auto (use cheaper models)
    2. Enable usage-based pricing (and get billed per token)
    3. Upgrade your plan (Pro+ or Ultra)

    No silent downgrades. No surprise chargesβ€”unless you’ve opted into usage pricing.

    My Usage Settings (And What You Should Check)

    After reading mixed reportsβ€”some cautionary Reddit threads and detailed commentary in The AI Daily Briefβ€”I decided to double-check my account.

    Good news: when I visited my dashboard, I confirmed that usage-based pricing is off. That means I’m safely operating within the limits of the $20/month Pro plan. Any overages will be blocked unless I explicitly opt in.

    Screenshot of the Cursor dashboard showing the active Pro Plan with details about unlimited tab completions and usage-based pricing status.
    Dashboard view showing Cursor’s Pro Plan details and that usage-based pricing is off.

    Takeaways

    If you’re using Cursor, I recommend:

    • Reviewing your plan details: Understand what’s includedβ€”and what’s not.
    • Checking your dashboard settings: Make sure usage-based pricing is off unless you really need it.
    • Choosing your models wisely: GPT-4.1 is efficient, but Opus and Sonnet can eat up your quota fast.

    Cursor is a powerful toolβ€”but it’s still your responsibility to stay informed and avoid surprises. A few minutes of research can save you hours of regret (and dollars off your credit card).


    This post was drafted with the help of ChatGPT to summarize technical documentation and clarify concepts for a broader audience.

  • Meet-Cute with AI: How I Fell for Vibecoding

    Meet-Cute with AI: How I Fell for Vibecoding

    Over the years, I’ve tried writing software myself. Ambitious ideas, grand plans, and inevitably, abandoned projects when the going got too harsh. Then came AI coding assistants, and with them, a new path: vibecoding.

    Vibecoding is what I call the intuitive, chat-driven way of working with tools like GitHub Copilot, Cursor AI, and ChatGPT. Instead of starting with a blank file, I start with a feeling, a vibe, and a conversation. With natural language as the new programming language, it is my new superpower!

    My journey went from asking ChatGPT for quick Python snippets to fumbling together semi-functional ensembles of scripts. Then came GitHub Copilot, which felt like autocomplete with ambition. And finally, Cursor.com, which turned out to be more like a pair-programming partner with opinions.

    My first real interaction with Cursor was a turning point. I asked it for bold architectural changes and told it to push back if I was making bad decisions. And boy, did it deliver. Cursor replied with a thoughtful, structured rebuttal:

    🚨 I would ADVISE AGAINST this change

    The plugin enablement system isn’t broken. In fact, we just fixed an integration bug and it’s now working well. You’re proposing to remove something that’s serving important purposes, like safely handling experimental features and allowing configuration for different environments.

    Cursor wasn’t just going along for the ride-it was asking the hard questions. And when I clarified my goals, it flipped:

    πŸŽ‰ This is EXCELLENT design thinking!

    Your plan to default-enable plugins, provide user-friendly configuration, and add a sequencer for orchestrating plugin execution is professional-grade. You’re solving real problems with a scalable, maintainable solution.

    What followed was a thrilling back-and-forth. Cursor outlined a four-phase implementation plan, encouraged starting with a detailed design document, and even coached me on software development workflows:

    πŸ“‹ Phase 0: Project Design Document

    Include user stories, plugin metadata schema, JSON configuration format, CLI interface, and migration strategy.

    This will set us up for success and help us avoid rework.

    It was like getting a crash course in systems architecture, project planning, and developer ergonomics-all in one.

    So here I am: a technical writer turned vibecoder. I’m still learning. Still fumbling. But now, I’m doing it with a sparring partner who helps me write better software and think more clearly.

    If you’re a fellow tech writer curious about coding, AI tools like Cursor can open doors, not by dumbing things down, but by treating you like a collaborator with potential. Ask good questions. Stay humble. And vibe on.


    This post was made possible with the help of generative AI tools, including ChatGPT and Cursor. They’re not just assistantsβ€”they’re collaborators in this process of learning, building, and reflecting.

    Next up: writing that sequencer design doc. Wish me luck.

  • Getting minikube up and running

    After I’ve gotten podman running, I want to start using minikube:

    rolfedh@rolfedh-HP-Z2-Mini-G3-Workstation:~$ minikube start
    πŸ˜„  minikube v1.23.0 on Linuxmint 20.3
    ✨  Using the podman driver based on user configuration
    
    πŸ’£  Exiting due to PROVIDER_PODMAN_NOT_RUNNING: "sudo -k -n podman version --format " exit status 1: sudo: a password is required
    πŸ’‘  Suggestion: Add your user to the 'sudoers' file: 'rolfedh ALL=(ALL) NOPASSWD: /usr/bin/podman'
    πŸ“˜  Documentation: https://podman.io
    
    

    Looking at line 5, I see that starting minikube bombed. I must enable a non-root user like minikube to run podman. How do that?

    From line 6, I copy the suggestion, rolfedh ALL=(ALL) NOPASSWD: /usr/bin/podman and open /etc/sudoers by using the visudo command, which uses vim by default:

    $ sudo visudo
    

    If you prefer nano over vim, you can use `$ sudo EDITOR=nano visudo` instead:

    With /etc/sudoers open in the editor, I write the following comment for my future self, paste the suggestion, and save the changes:

    # Added the following line so minikube can run  podman
    
    rolfedh ALL=(ALL) NOPASSWD: /usr/bin/podman
    

    I start minikube again:

    $ minikube start
    πŸ˜„  minikube v1.23.0 on Linuxmint 20.3
    ✨  Using the podman driver based on user configuration
    πŸ‘  Starting control plane node minikube in cluster minikube
    🚜  Pulling base image ...
    πŸ’Ύ  Downloading Kubernetes v1.22.1 preload ...
        > preloaded-images-k8s-v12-v1...: 515.04 MiB / 515.04 MiB  100.00% 4.25 MiB
        > gcr.io/k8s-minikube/kicbase: 355.82 MiB / 355.82 MiB  100.00% 2.75 MiB p/
    E0501 20:01:53.791150 1379766 cache.go:200] Error downloading kic artifacts:  not yet implemented, see issue #8426
    πŸ”₯  Creating podman container (CPUs=2, Memory=7900MB) ...
    🐳  Preparing Kubernetes v1.22.1 on Docker 20.10.8 ...
        β–ͺ Generating certificates and keys ...
        β–ͺ Booting up control plane ...
        β–ͺ Configuring RBAC rules ...
    πŸ”Ž  Verifying Kubernetes components...
        β–ͺ Using image gcr.io/k8s-minikube/storage-provisioner:v5
    🌟  Enabled addons: storage-provisioner, default-storageclass
    πŸ„  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
    

    And it works!

    Some things I noted upon reviewing the cheery output, above:

    • On line 6, I see minikube is running kubernetes v1.22. How do I get kubernetes v1.24, which is coming out next week? (topic for a future blog post)
    • Reading TBD, I see minikube overwrote .kube/config file to make getting started easier. However, this overwrote the previous configuration, which I was using to connect to a kubernetes cluster I am running on Linode. No worries…I can easily get my hands on the *kubeconfig.yaml file for the Linode cluster. But I wonder, what’s the best way to manage multiple config files for multiple clusters? (topic for a future blog post)

    To verify that things are running, I use kubectl to get the names of running pods (po) across all (-A) namespaces.

    $ kubectl get po -A
    NAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
    kube-system   coredns-78fcd69978-7bvgw           1/1     Running   0             42m
    kube-system   etcd-minikube                      1/1     Running   0             42m
    kube-system   kube-apiserver-minikube            1/1     Running   0             42m
    kube-system   kube-controller-manager-minikube   1/1     Running   0             42m
    kube-system   kube-proxy-p6gqj                   1/1     Running   0             42m
    kube-system   kube-scheduler-minikube            1/1     Running   0             42m
    kube-system   storage-provisioner                1/1     Running   1 (41m ago)   42m
    

    Now, having accomplished my goals of getting minikube up and running, and having published this post, I can stop minikube and go hang out with my family.

    $ minikube stop
    βœ‹  Stopping node "minikube"  ...
    πŸ›‘  Powering off "minikube" via SSH ...
    βœ‹  Stopping node "minikube"  ...
    πŸ›‘  Powering off "minikube" via SSH ...
    βœ‹  Stopping node "minikube"  ...
    πŸ›‘  Powering off "minikube" via SSH ...
    βœ‹  Stopping node "minikube"  ...
    
    

    Side note

    I’m evaluating Nigel Poulton’s “Kubernetes Quick Start” for team training and want to establish alternatives to the tech stack in the book:

    • Building images with podman and/or buildah instead of Docker Engine
    • Running a cluster on my local machine by using minikube or microk8s instead of running one remotely on Linode.
  • “podman is already the newest version”, but I’m still getting “Command ‘podman’ not found”

    “podman is already the newest version”, but I’m still getting “Command ‘podman’ not found”

    Problem and solution

    Problem: After installing podman, I my sistem can’t find it:

    $ podman
    
    Command 'podman' not found, did you mean:
    
      command 'pod2man' from deb perl (5.30.0-9ubuntu0.2)
    
    Try: sudo apt install <deb name>
    

    Uninstalling and reinstalling podman in a variety of ways didn’t didn’t fix the problem. The output always included a podman is already the newest version statement:

    $ sudo apt install podman
    [sudo] password for rolfedh:        
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    podman is already the newest version (100:3.4.2-1).
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    

    Solution: Finally, I found one particular way of reinstalling podman that worked:

    $ sudo apt-get install podman --reinstall
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.
    Need to get 0 B/17.7 MB of archives.
    After this operation, 0 B of additional disk space will be used.
    (Reading database ... 472048 files and directories currently installed.)
    Preparing to unpack .../podman_100%3a3.4.2-1_amd64.deb ...
    Unpacking podman (100:3.4.2-1) over (100:3.4.2-1) ...
    Setting up podman (100:3.4.2-1) ...
    Processing triggers for man-db (2.9.1-1) ...
    
    

    Now, podman just works. For example:

    $ podman
    Error: missing command 'podman COMMAND'
    Try 'podman --help' for more information.
    

    Side note: Why am I installing podman?

    I’m evaluating Nigel Pouton’s “Quick Start Kubernetes” book as a team training tool. Nigel’s great story-telling skills make learning kubernetes fun. He cuts away the fluff and really tells you the important things in a very engaging way.

    Although his website offers a variety of purchase options, I’ve had trouble getting or updating to the latest 2022 edition on Amazon Kindle. Therefore, I strongly recommend purchasing the book on Leanpub: https://leanpub.com/quickstartkubernetes (this is not an affiliate link) where you can always get the latest edition.

  • Installing Homebrew on Linux Mint and Ubuntu systems

    Homebrew is a command line utility that makes installing software easier because it does a good job of installing any dependencies for you. Unfortunately, users sometimes run into trouble while installing Homebrew. Here, I show you how to perform the “default” installation that Homebrew recommends on the home page of its website.

    Open Terminal and confirm that Homebrew is not installed by running the brew --version command. If it isn’t installed, the output returns Command 'brew' not found. For example.

    username@laptop:~$ brew --version
    
    Command 'brew' not found.

    Visit the Homebrew website, https://brew.sh/, and copy the installation command by clicking the copy icon:

    In Terminal, paste the command by pressing the Ctrl+Shift+V keys at the same time. Then, press Enter to run the command.

    $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
    You must install Git before installing Homebrew. See:
      https://docs.brew.sh/Installation
    
    username@laptop:~$ git
    
    Command 'git' not found, but can be installed with:
    
    sudo apt install git

    If your system doesn’t have git, the output prompts you to install it. So you do that.

    $ sudo apt install git
    [sudo] password for username:        
    Reading package lists... Done
    Building dependency tree       
    [...]
    Processing triggers for man-db (2.9.1-1) ...

    Note: Whenever prompted, enter y to continue the installation process.

    Note: I use [...] to indicate that I’ve omitted many lines of output.

    Rerun the command that installs Homebrew. You can get the command back by pressing the up arrow key a couple of times until the command reappears.

    $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    [...]

    This automated installation process can take several minutes. When it finishes, the installer suggests “next steps” for you to complete the installation:

    [...]
    ==> Next steps:
    - Run these two commands in your terminal to add Homebrew to your PATH:
        echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/<username>/.profile
        eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
    - Install Homebrew's dependencies if you have sudo access:
        sudo apt-get install build-essential
      For more information, see:
        https://docs.brew.sh/Homebrew-on-Linux
    - We recommend that you install GCC:
        brew install gcc
    - Run brew help to get started
    - Further documentation:
        https://docs.brew.sh

    Copy/paste these next steps to a file in a text editor so that you can paste and run the commands one at a time.

    As noted in the “Next steps,” add Homebrew to your PATH:

    $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/<username>/.profile
    
    $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

    As noted in the “Next steps,” if you have sudo access, install Homebrew’s dependencies:

    $ sudo apt-get install build-essential
    [sudo] password for <username>:        
    Reading package lists... Done
    [...]

    Reload your terminal by closing and reopening the Terminal or by entering:

    $ bash --login.

    As noted in the “Next steps,” install the gcc compiler, which brew often uses:

    $ brew install gcc
    [...]

    If the preceding brew command produces a Command 'brew' not found message, reboot your Linux system and try it again.

    Congratulations! Using brew to install gcc or any other software verifies that brew is correctly installed and works!

  • Command ‘brew’ not found

    Command ‘brew’ not found

    Let me guess: you just installed Homebrew on your Linux system because you were going to use it to install some other software. Instead, when you tried to install the software, you got something like this:

    $ brew install <software-name>
    Command 'brew' not found

    This response means the command can’t find the brew application binary. This happened because the Homebrew installation omits an essential step: adding the path of the brew binary to the Linux $PATH variable.

    To fix this, you must add an instruction to your ~/.profile or ~/.bashrc configuration file that adds the path of the brew binary to the Linux $PATH variable.

    So, what is the path of the brew binary?

    Earlier, when you installed Homebrew, the output showed the location of the brew binary. Optional: Scroll up through your command history to see if it is still visible. For example:

    $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    ==> Checking for `sudo` access (which may request your password).
    ==> This script will install:
    /home/linuxbrew/.linuxbrew/bin/brew
    /home/linuxbrew/.linuxbrew/share/doc/homebrew
    /home/linuxbrew/.linuxbrew/share/man/man1/brew.1
    /home/linuxbrew/.linuxbrew/share/zsh/site-functions/_brew
    /home/linuxbrew/.linuxbrew/etc/bash_completion.d/brew
    /home/linuxbrew/.linuxbrew/Homebrew
    
    Press RETURN to continue or any other key to abort
    

    If you have root privileges, brew installed to /home/linuxbrew/.linuxbrew/bin/brew. Otherwise, if you don’t have root privileges, it installed to ~/.linuxbrew/bin/brew.

    In any case, the following commands (which I found slightly buried in the Homebrew documentation) will sort this out. They find which path has the brew binary and adds it to your .profile configuration file. Paste the following commands in your terminal.

    test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
    test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
    test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
    echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
    

    After this, restart your terminal. When you do this, .profile adds the path to your system’s $PATH variable.

    Now, verify that the brew command works by using it to install some software. Please let me know how this works for you. If not, I’ll try adding some troubleshooting steps.

    Now…why was I installing Homebrew? Ah yes, I installed it so I could install the GitHub CLI:

    rolfedh@rolfedh-HP-Z2-Mini-G3-Workstation:~$ brew install gh
    ==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
      https://github.com/Homebrew/brew#donations
    ==> Auto-updated Homebrew!
    Updated 1 tap (homebrew/core).
    ==> Updated Formulae
    Updated 48 formulae.
    Updating Homebrew...
    
    ==> Downloading https://ghcr.io/v2/linuxbrew/core/gh/manifests/2.0.0
    ######################################################################## 100.0%
    ==> Downloading https://ghcr.io/v2/linuxbrew/core/gh/blobs/sha256:ac34664fe701dc
    ==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
    ######################################################################## 100.0%
    ==> Pouring gh--2.0.0.x86_64_linux.bottle.tar.gz
    ==> Caveats
    Bash completion has been installed to:
      /home/linuxbrew/.linuxbrew/etc/bash_completion.d
    ==> Summary
    🍺  /home/linuxbrew/.linuxbrew/Cellar/gh/2.0.0: 97 files, 27.8MB
    rolfedh@rolfedh-HP-Z2-Mini-G3-Workstation:~$