Jekyll2026-03-18T08:41:44-04:00https://jamiedubs.com/feed.xmlJamie WilkinsonI move away from the mic to breathe inBUY NOW - BeOS screensaver for macOS2025-11-15T00:00:00-05:002025-11-15T00:00:00-05:00https://jamiedubs.com/blog/buy-now-screensaver-for-macosThis is a recreation of the famous BeOS “BUY NOW” screensaver for macOS. It has a dark blue background and white text.

BUY NOW screensaver

Download on GitHub

Original screensaver by Ficus Kirkpatrick

Shoutout to Toastycode who made a Mac version of this previously.

In 1995 BeOS shipped with pervasive multithreading, symmetric multiprocessing, and a 64-bit filesystem.

]]>
How to disable Siri reply suggestions in Messages on macOS2025-09-10T00:00:00-04:002025-09-10T00:00:00-04:00https://jamiedubs.com/blog/how-to-disable-siri-auto-replies-in-macos-messagesI hate these Siri suggested replies in the Messages app in macOS 15+ (Sequioa). This post has a fix that actually works.

Screenshoot of auto-suggested replies in macOS Messages app

To disable these annoying auto-replies, go to System Settings > Keyboard > Input Sources > Text Input and disable “Suggested Replies”

Screenshot of 'Keyboard' system settings dialog

Screenshot of 'Text Inputs' dialog inside Keyboard system settings, with 'Suggested Replies toggle

The suggestions are mediocre at best, but more annoyingly, they steal keyboard focus and I have to press “esc” a couple times to actually start typing.

There’s a bunch of Apple support threads and this reddit thread but instructions were incorrect, so here we are! Good luck

]]>
Computers controlling web browsers2025-04-01T00:00:00-04:002025-04-01T00:00:00-04:00https://jamiedubs.com/blog/computers-controlling-web-browsersAmazon launched Nova Act yesterday, which is their “control a web browser with an LLM” solution. This is comparable to GPT Operator, Claude Computer Use and Open Interpreter (the last is my favorite, and open-source)

I don’t get too excited about these anymore. They make for really fun one-off demos, but for repeated tasks they’re slow, unreliable, fall out-of-date, and get blocked by captchas and other anti-bot tech.

I’ve worked with tons of web browser automation tools via LLMs, via code, for testing my apps, for scraping other websites, you name it. Playwright, Puppeteer, Rabbit r1 (lol), plus hosted solutions like BrowserBase, Checkly, and Anon (the last is my favorite)

My money says websites that want to be accessed by agents/LLMs will expose APIs or add accessibility flags that make using a full-blown web browser unnecessary. Web browsers are kind of bloated and meant for humans. APIs are good clean machine interfaces for machines.

Websites that don’t want to be controlled by agents have already implemented aggressive anti-bot tech and don’t have an API for a reason. Ticketmaster etc. Every website backed by Cloudflare will eventually serve you a captcha.

Hosted browser services use all kinds of tricks to get around this: fingerprint spoofing, residential proxies, captcha farming, faux clicks, etc. These the same tactics employed by spammers. This is a tough problem.

So I think these headed- and headless browser solutions will work well as a sort of stop-gap for sites without APIs that don’t mind bots visiting, but I’m not expecting much more than that. It’s just way faster to control Spotify using API calls than via any of their user interfaces. I’m still gonna follow along with computer-use developments, but I rate it “idk, depends on what you’re doing” for now

This post also on:

]]>
AI-assisted code tools of the now2025-03-27T00:00:00-04:002025-03-27T00:00:00-04:00https://jamiedubs.com/blog/ai-code-tools-power-summary-stack-rankBy request, here is my list of AI app development tools that I’ve used and recommend you check out, as of March 2025. It’s grouped by amount of code and roughly stack-ranked by quality and ease-of-use.

the low/mid-zone is the most vibe-codey, by the “never look at the code, use voice dictation, wear sunglasses” definition of vibecode. this is simonw’s interpretation of the og Karpathy.

I’m not including no-code things like Glif, GPTs, n8n or various mixed-agent-builder platforms etc which are a different post.

if you want to make a simple little web app and haven’t tried Lovable or Bolt recently I’d strongly recommend checking those out. Build via chat, don’t need to look at the code if you don’t want to, and really consistent. They both integrate tightly with Supabase for database, authentication and asset storage, and work well. Configuring your app via chat with inline “Login to Supabase” buttons is cool. Vercel v0 does similar but a bit more work to configure atm

Valtown is the “mid-code” part of the spectrum. You’re looking at code, but the AI assistant Townie is probably doing a lot of the work for you. I looooove Valtown. it’s friendly, super easy to use and debug, fun to find and remix other people’s projects, and the team is great. The new multi-file Valtown Projects feature lets you build ‘real’ apps. They also natively support databases, assets/blobs, and even email send and receive. The only negative (and for me this is nbd) is that it only supports Deno-flavored js/ts

Replit is a full notch more code-heavy than Valtown. it’s reliable and can run code in any language, but it is also a lot more complicated to use and debug. maybe more suitable for ‘serious’ projects but I still prefer Valtown if I can.

The “full-code” side of the spectrum is Claude Code, Cline/Roocode, Windsurf/Cursor, aider. Much has been written about this elsewhere. My tldr: Cline is maybe most approachable since you can use it in VScode, which you probably already have installed, but it’s also fast & loose with context tokens and can run up $ bills quite quickly. Claude Code is dope, really nice TUI, some quirks but smart overall. Windsurf and Cursor are maybe the most friendly for developers who want a more curated experience, and Windsurf is much better than Cursor imho. In both cases the built-in browsing and docs tools are great. they all support MCP servers too. Aider is the most hardcore, super powerful, much more involved but produces amazing results if you know what you’re doing.

FWIW I find these tools really take 2-3 hours to properly learn and would recommend you bucket accordingly. takes 10-15 mins to get setup, first hour kind of like eh, second hour is actively productive.

Lastly, everything in this post will be out-of-date as soon as I press publish. generative AI is nuts rn

]]>
LLM plugins and the state of MCP2025-03-21T00:00:00-04:002025-03-21T00:00:00-04:00https://jamiedubs.com/blog/llm-plugins-and-the-state-of-mcpLots of hype and debunking around MCP (Model Context Protocol) flying around lately. I’ve been working with it since launch and believe all of these are true:

  1. MCP is complex, overengineered, hard to host in cloud, security model is nonexistent, weird naming, registries are messy, community is messy. All of that is rapidly improving, especially the technical shortcomings1 2, but out of the gate it has some serious issues.

  2. MCP is also by far the best current solution for “LLM plugins” or “SDK but for LLMs”. Everything else is either proprietary or involves us all writing the same code over and over. Why would we all write and debug and maintain the same approximate API-calling implementations? This is why SDKs exist too.

Most platforms w/ a serious API publish an OpenAPI spec and SDKs in popular languages like typescript, python, etc. I think we’ll all also publish an MCP server that lets you use the API via LLM right away too. These SDKs and servers could just be generated from the spec and an llms-full.txt. I’m willing to bet the LLM plugins (the MCP servers) will quickly become the most popular way to interact with those APIs.

Lastly: MCP servers aren’t restricted to HTTP APIs. Desktop apps (and maybe even mobile apps) can expose tools to LLMs, like we’re seeing with Blender MCP and Ableton Live MCP.

The tool-use-centric paradigm for LLMs is incredibly powerful, and made even more powerful when run through battle-tested expert systems. Instead of doing a one-shot “make me a 3D model of pikachu with a sword,” I can have an interactive chat with Blender and work incrementally and within the well-defined rules of a domain-specific piece of software. In the same way that it doesn’t make sense for all of us to reimplement the same API-calling code over and over, it makes sense to leverage the years of work that have gone into existing creative software. Eventually I imagine you’ll see an LLM built-in to pretty much every piece of software, cloud or local, since it makes every app so much more approachable and more powerful. It’s just tools all the way down.

]]>
The Demo Rules2023-10-11T00:00:00-04:002023-10-11T00:00:00-04:00https://jamiedubs.com/blog/def-demo-rulesI love demos. These are the rules we used for the bi-weekly demo sessions at DEF. “A safe space to show off your projects.” These aren’t for everyone, but this is a good starting point for running a good demo session:

The Demo Rules

  • 15 mins per slot: 10 mins for demo, 5 mins for Q&A, YMMV
  • Bugs and issues are expected. If we do a demo session without glitches, we have failed.
  • If a presenter is having issues or app is being slow, we don’t complain, we wait patiently.
  • If someone bravely shares their whole screen and receives a sensitive notification, you must close your eyes and pretend it didn’t happen.
  • Moderator will read the chat and pass along questions & praise and especially praise.
  • Free scope creep, all you can eat!

Bonus

  • Turn on your video if you’re willing. Otherwise we are all just random usernames on the Internet
  • Demos are default-private. Please don’t post other people’s work on social media w/o permission. we post a few screenshots in #mouths-only-sidechat but if you’d prefer we didn’t do that, just say so. sometimes Varley edits together recap videos, but we will always ask if you’re cool sharing
]]>
How to be a Helium price oracle2021-11-22T00:00:00-05:002021-11-22T00:00:00-05:00https://jamiedubs.com/blog/how-to-be-an-hnt-price-oracleThe Helium Network Wants YOU To Submit HNT Prices Regularly (It’s Easier Than You Think)

Background

The first rule of being an oracle is that you don’t talk about being an oracle.

The second rule of being an oracle is to submit HNT prices early and often. Daily at a minimum; hourly would be great. Prices are reset every 30 blocks (30 minutes), and a majority of oracles must vote within a rolling 24 hour period for a price to be set. Otherwise we end up with stale pricing data and flat spots, like this nonsense:

Here’s what it looks like when the number of voting oracles falls below a majority, represented by the the dashed threshold line (data & graph from DeWi ETL)

Read more about oracles on docs.helium.com and then check out all the sick charts of oracles (allegedly) submitting prices on the DeWi ETL Oracles dashboard

Setup

You’ll need to be comfortable with the commandline, and ideally have a dedicated server you can setup to automatically submit prices on a regular basis. Update: don’t use a Raspberry Pi, helium-wallet-rs doesn’t build on ARM.

  1. Download and install the commandline helium-wallet
  2. Create a fresh mainnet wallet
helium-wallet create basic
Password: [unique long top secret password]
Confirm: [unique long top secret password]
  1. Backup that new wallet.key keyfile somewhere super duper safe
  2. Send the wallet address to your top secret handler. I don’t know who this is, don’t ask.

Submit prices

Helium has made this very easy. Thank you Louis. You don’t even need to look up the HNT price – you can use helium-wallet to automatically fetch and submit the latest price from Coingecko, Bilaxy or Binance:

helium-wallet oracle report --block auto --price coingecko --commit

This assumes the wallet.key is in the same directory. Use -f ~/path/to/oracle-wallet.key otherwise.

Lastly, setup a script to automatically submit prices on a regular basis. You can use the HELIUM_WALLET_PASSWORD environment variable to automatically enter your wallet password; keep this safe.

Here is a basic shell script:

#!/bin/bash
export HELIUM_WALLET_PASSWORD="[unique long top secret password]"
keyfile="$HOME/path/to/oracle-wallet.key"
source="coingecko" # bilaxy, binance

# Try three times before giving up
# Sometimes Coingecko is tired
n=0
until [ "$n" -ge 2 ]; do
  echo "attempt $n ..."
  $HOME/bin/helium-wallet -f "$keyfile" oracle report --block auto --price "$source" --commit 2>&1 && break
  n=$((n+1))
  sleep 5
done

Then throw it in your crontab (crontab -e):

# Submit HNT prices hourly
@hourly   /home/pi/bin/helium-oracle-submit | grep -v "timed out" >/dev/null

You did it

Please contact me (email and Discord username are on jamiedubs.com) and we’ll see about getting you added to the official list. And remember, if you stop submitting prices, you bring great shame on your family!

Thank you for your service

]]>
Go pitch yourself2021-10-27T00:00:00-04:002021-10-27T00:00:00-04:00https://jamiedubs.com/blog/go-pitch-yourselfIf I’m going to be pitching an idea to other people, I think it’s important to practice saying it out loud. So, even though I hate the sound of my own voice, I pitch it to myself.

I go get a coffee, fire up Voice Memos on my phone, and walk around the city explaining my idea as succinctly as possible. Then I listen back to it, cringe horrifically, and do it again.

While developing an idea, I usually start with notes or writing or slides. But if I’m ever going to be presenting or explaining it out loud, I need to practice it out loud. Reading it in my head is not the same. Some words look good on paper but don’t translate well to speech; some turns of phrase are impossible to remember on the spot.

On the first listen-through, I try to just eliminate the uhms and ahhs. These are a sign that I am not confident in what I am saying, and I usually just cut whatever made me pause.

On the second, third, and fourth passes, I ask: am I rambling? Where should I be pausing and waiting for a reaction? Did I say the same thing twice, just in different ways? Am I talking too fast? (I am always talking too fast; I have never thought I was talking too slowly)

When I did college radio I recorded all my shows and forced myself to listen back through them. The music selection was stellar, naturally. The mixing was decent. The mic breaks were painful. I would awkwardly back-ID tracks, sloppily interview guests, make terrible jokes, and otherwise embarass myself on air. I hated every second of listening to myself, but I got better every week. Clearer, more succinct, better mic handling, better corraling of guests, better timing with the sound effects, background music at just the right level.

I started doing this “pitch myself” idea based on a suggestion from Diana Kimball Berlin, who would wear a lapel mic and record her talks, so she could post them on SoundCloud. I just started recording the practice talks too.

]]>
Hacking PartyBid to bid on unsupported Foundation Collections2021-10-07T00:00:00-04:002021-10-07T00:00:00-04:00https://jamiedubs.com/blog/how-to-partybid-on-a-foundation-collection-piece

So you want to partybid on something in the cool new Foundation Collections, but the PartyBid frontend doesn’t support it? And the auction is over in 12 hours you say?

You’re in luck, we just hacked our way through this today, lofi permissionless blockchain-style!

Using a contract deployed via Etherscan and a custom lil’ web frontend, DefMicroParty pooled ~6 ETH and is now the proud owner of Jen Stark’s beautiful Microcosm #22

I wrote up this HOWTO for Sirsu but thought it might be helpful for everyone else trying to do this <3

You’ll need to do a few things, and some technical savvy is required:

  1. Dig up the NFT contract address, token ID and auction ID
  2. Deploy a PartyBid contract instance using Etherscan
  3. Deploy your own version of the custom web frontend – UPDATE: thanks to SteveK, the partybid.app frontend now supports custom contracts

If you’re into this or have any questions, feel free to join us on the new Definitely Crypto discord server – “a place for friends” (and hackers, designers, writers, musicians, businesspeoples, activists, lawyers, vandals and anyone else who likes making stuff and having fun)

Deploy a PartyBid contract instance

  1. Choose an artwork, fund your wallet and rally your posse

For Sirsu this is https://foundation.app/@yatreda/taitu/10 (awesome piece)

  1. Find the piece you want on Foundation and copy its custom contract URL:

in this case: 0x814A056F1607C7F43285a1a1de43755Ed3b26eE7

  1. Look up the tokenID – this is generally in the link from Foundation too

%%!Screen Shot 2021-10-07 at 17-17-00 Kingdoms of Ethiopia (TAITU) Token Tracker Etherscan.png %%

Ours is 10

  1. Look up the Foundation auction ID for that specific token

I visit the Foundation Market contract on Etherscan to look this up: 0xcDA72070E455bb31C7690a170224Ce43623d0B6f

https://etherscan.io/address/0xcda72070e455bb31c7690a170224ce43623d0b6f#readProxyContract

Use the getReserveAuctionIdFor function and put in your NFT contract from step 2 and your token ID from step 3

%%!Screen Shot 2021-10-07 at 17-22-30 Foundation Market 0xcDA72070E455bb31C7690a170224Ce43623d0B6f.png %%

Ours is 97237

Now you have your arguments for the startParty contract call:

_marketWrapper (address):  0x96e5b0519983f2f984324b926e6d28C3A4Eb92A1
_nftContract (address) 0x814A056F1607C7F43285a1a1de43755Ed3b26eE7
_tokenId (uint256) 10
_auctionId (uint256) 97237
_splitRecipient (address) 0x0000000000000000000000000000000000000000
_splitBasisPoints (uint256) 0
_name (string): WhateverYouWant
_symbol (string): WHATEVERUWANT

Time to deploy a PartyBid instance!

Visit the PartyBidFactory contract on Etherscan: https://etherscan.io/address/0xAba3506DDF718278632B245ad0d86BB81070BA47#code

Fill in the values you dug up:

%%!Screen Shot 2021-10-07 at 17-24-49 PartyBidFactory 0xAba3506DDF718278632B245ad0d86BB81070BA47.png %%

Write contact and hold onto your butts!

Deploy the lofi custom frontend

UPDATE: thanks to SteveK, the partybid.app frontend now supports custom contracts and this is no longer necessary.

Once deployed, you will want to contribute funds. Unfortunately the partybid.app UI does not currently support this. You’ll need to deploy a copy of a custom web3 frontend that Shahruz wrote in like 30 minutes:

https://github.com/shahruz/defparty

The fastest ways to deploy this are setting it up on Vercel or Netlify. This is more involved and a little bit beyond the scope of this guide, but you can check those sites for getting-started guides. Both are relatively easy if you’ve built a web app before, but grab a friend if that’s new territory for you.

The frontend we used to win Microcosmos #22 is here as an example: https://defparty.netlify.app/

You will need to edit this file to put in your contract address, your own Infura key, plus links to your own relevant things so folks don’t think they’re on a completely sketchy website:

https://github.com/shahruz/defparty/blob/main/src/pages/index.tsx

We’re planning to clean this up and move some things to ENV vars, which would graduate this from dirtstyle to double dirtstyle

Big thank you to Steve Klebenoff, Shahruz, Matt Lehrer, everyone in Definitely Crypto, everyone else who participated in this PartyBid, and especially Jen Stark for the beautiful work!

]]>
Breaking down the Songcamp $ELEKTRA crowdfund2021-07-13T00:00:00-04:002021-07-13T00:00:00-04:00https://jamiedubs.com/blog/breaking-down-songcamp-elektra-crowdfund

I backed the Songcamp art collective’s new Elektra crowdfund on Mirror this morning. Pretty cool use of multiple crowdfunding and community-building mechanics, and the project itself is very stylish and narrative-heavy. Kind of like an ARG, kind of like a DAO, kind of something else?

The crowdfund used Mirror’s Editions feature to offer 3 different tiers of rewards, at 0.1 ETH, 0.3 ETH and 1 ETH. Per typical Mirror crowdfund, backers receive both a ticket-NFT and $ELEKTRA governance tokens proportional to their contribution. But this is also the first crowdfund using Mirror’s new Podium feature, which gives special NFTs to the top 3 bidders:

Ticket-NFT itself is a cool Top Shot-style 3D hologram video:

Then all NFT owners can immediately join a community Discord server by visiting a slick “Portal to Elektra” landing page:

After authenticating your NFT ownership with their Collab.land bot, the story begins…

Some more highlights from their crowdfund pitch:

On Elektra, music is energy. Music is the fuel, electricity, and light of the world.

Centuries ago, Elektra had a thriving civilization with a deep rooted sense of value towards art. But soon, motives around greed and self-interest took over, and the music that powered this world was lost.

Your mission is to travel to Elektra, and help us collectively revive, restore and reignite this once beautiful world back to health.

Will you accept your mission?

The team is significant:

The Songcamp Elektra project is made up of ~42 artists, devs, project ops and strategists working together to bring this world to life. This crowdfund intends to raise the funds that will enable us to do just that.

And props for disclosing how you plan to use the funds:

We will use 90% of the amount raised to put towards the Elektra project.

These funds will go toward the core team of project managers, web developers, artists and strategists working directly on the project. Other costs include transaction fees on the Ethereum blockchain, web hosting and file storage. We intend to save a portion of these funds to act as the seed money in standing up the ElektraDAO once this initial phase of the project is complete (more on that below).

The remaining 10% will go directly to the artists who created the Portal Ticket visuals.

]]>