<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://jamiedubs.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jamiedubs.com/" rel="alternate" type="text/html" /><updated>2026-07-10T09:17:20-04:00</updated><id>https://jamiedubs.com/feed.xml</id><title type="html">Jamie Wilkinson</title><subtitle>Official personal WWW homepage website</subtitle><entry><title type="html">NYC derelict/abandoned bike complaints</title><link href="https://jamiedubs.com/blog/nyc-derelict-abandoned-bike-complaints/" rel="alternate" type="text/html" title="NYC derelict/abandoned bike complaints" /><published>2026-04-20T00:00:00-04:00</published><updated>2026-04-20T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/nyc-derelict-abandoned-bike-complaints</id><content type="html" xml:base="https://jamiedubs.com/blog/nyc-derelict-abandoned-bike-complaints/"><![CDATA[<p>I spotted a bike in Brooklyn with a yellow DSNY “derelict bicycle” sticker on it, the kind that says “this will be removed in 7 days.” I’ve lived in NYC for years but never actually seen one of these in the wild before!</p>

<p><img src="/images/blog-posts/abandoned-bikes-sticker.jpeg" alt="A bike with a yellow DSNY derelict bicycle sticker in Brooklyn" /></p>

<p>So I got curious: how often does this actually happen? How many bikes get reported as derelict or abandoned? What happens to them?</p>

<h2 id="how-many-bikes-get-removed">How many bikes get removed?</h2>

<p>Short answer: not many.</p>

<p><img src="/images/blog-posts/abandoned-bikes-volume-by-year.png" alt="NYC abandoned bike complaints vs removals by year, 2010-2026" /></p>

<p>Complaints about abandoned bikes grew from 88 in 2010 to an all-time peak of 2,588 in 2018, dipped during COVID, and have rebounded to roughly that level: 2,508 in 2024, 2,108 in 2025.</p>

<p>From 2021 onward, the removal rate hovers around 8-11%. Pre-2021 removal data is basically empty, so I assume DSNY just wasn’t logging it. But there’s a couple records, so maybe they weren’t actually removing anything until 2021?</p>

<p><img src="/images/blog-posts/abandoned-bikes-removal-rate.png" alt="NYC Derelict Bike Complaints: Naive vs Deduplicated Removal Rate" /></p>

<p>Note that this 8-11% removal rate number is just “# removals divided by # complaints”, and doesn’t de-duplicate repeat complaints about the same bike.</p>

<p>There’s no unique bike ID in the data, so I tried deduplicating by address. <strong>Roughly a third of complaints are duplicates. One address in Bay Ridge (2030 76th Street) generated 122 complaints in 3.5 months on a bike DSNY kept saying didn’t meet the criteria.</strong> Both numbers are imperfect — naive over-counts repeat reports, dedup-by-address under-counts because the same rack hosts different bikes over the years - so I think the truth is somewhere in between.</p>

<h2 id="what-makes-a-bike-abandoned">What makes a bike “abandoned”?</h2>

<p><img src="/images/blog-posts/abandoned-bikes-outcomes.png" alt="What Actually Happens to NYC Derelict Bike Complaints" /></p>

<p>The dominant outcome is the orange block: <strong>37-44% of complaints close as “did not meet criteria.”</strong> The bike just isn’t broken enough by DSNY’s standards. Another 25-30% close as “no condition found” — which I think means DSNY showed up and the bike wasn’t there.</p>

<p>DSNY’s program runs under <a href="https://www.nyc.gov/assets/dsny/site/resources/recycling-and-garbage-laws/derelict-bicycle">Local Law 55</a>, and their definition of “unusable” requires <strong>two or more</strong> of these:</p>

<ul>
  <li>Appears crushed or unusable</li>
  <li>Missing parts essential to operation (handlebars, pedals, rear wheel, chain)</li>
  <li>Damaged handlebars/pedals or bent forks, frames, or rims</li>
  <li>50%+ rusted, including the chain locking it up</li>
</ul>

<p>The bar for removal is surprisingly high. Missing a seat alone doesn’t count, maybe because some people remove their seats to prevent theft. There’s <a href="https://www.reddit.com/r/NYCbike/comments/1cxmvjz/abandoned_bikes_on_a_noncity_owned_bike_rack/">a reddit thread</a> suggesting that ‘missing pedals’ are an unstated criteria for derelictness. Anecdotally, some folks have told me they’ve spent months going back and forth with DSNY on bikes missing wheels and handlebars and eventually gave up.</p>

<p>Notably DSNY will never remove <a href="https://en.wikipedia.org/wiki/Ghost_bike">ghost bikes</a> placed as memorials — hell yeah &lt;3</p>

<h2 id="data-and-code">Data and code</h2>

<p>I did this analysis using <a href="https://claude.ai">Claude</a>, pulling the NYC 311 data via the Socrata API and made the charts. The 311 dataset was split in late 2025 into a 2010-2019 archive (<a href="https://data.cityofnewyork.us/resource/76ig-c548.json">76ig-c548</a>) and a 2020-present live dataset (<a href="https://data.cityofnewyork.us/resource/erm2-nwe9.json">erm2-nwe9</a>). The complaint type was renamed from “Derelict Bicycle” to “Abandoned Bike” in 2021, so query both:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$where=complaint_type IN ('Derelict Bicycle', 'Abandoned Bike')
</code></pre></div></div>

<p>Public data, no API key needed. Full script below (also <a href="https://gist.github.com/jamiew/a265347b400276b9393f9b76d6a17d7c">on GitHub</a>):</p>

<script src="https://gist.github.com/jamiew/a265347b400276b9393f9b76d6a17d7c.js"></script>

<p>Thanks to <a href="https://patrickcleary.com">Patrick Cleary</a>, Zack Youngren, Paco, and Paul Schreiber via the TABK group chat for the discussion that made this way more interesting than just “here’s a chart.”</p>]]></content><author><name></name></author><category term="nyc" /><summary type="html"><![CDATA[I spotted a bike in Brooklyn with a yellow DSNY “derelict bicycle” sticker on it, the kind that says “this will be removed in 7 days.” I’ve lived in NYC for years but never actually seen one of these in the wild before!]]></summary></entry><entry><title type="html">BUY NOW - BeOS screensaver for macOS</title><link href="https://jamiedubs.com/blog/buy-now-screensaver-for-macos/" rel="alternate" type="text/html" title="BUY NOW - BeOS screensaver for macOS" /><published>2025-11-15T00:00:00-05:00</published><updated>2025-11-15T00:00:00-05:00</updated><id>https://jamiedubs.com/blog/buy-now-screensaver-for-macos</id><content type="html" xml:base="https://jamiedubs.com/blog/buy-now-screensaver-for-macos/"><![CDATA[<p>This is a recreation of the famous BeOS “BUY NOW” screensaver for macOS. It has a dark blue background and white text.</p>

<p><a href="https://github.com/jamiew/buynow-screensaver-mac"><img src="/images/buynow-screenshot.gif" alt="BUY NOW screensaver" /></a></p>

<p><strong><a href="https://github.com/jamiew/buy-now-screensaver-mac">Download on GitHub</a></strong></p>

<p>Original screensaver by <a href="http://toastycode.com/besavers/">Ficus Kirkpatrick</a></p>

<p>Shoutout to <a href="http://toastycode.com/besavers/buynow.html">Toastycode</a> who made a Mac version of this previously.</p>

<blockquote>
  <p>In 1995 BeOS shipped with pervasive multithreading, symmetric multiprocessing, and a 64-bit filesystem.</p>
</blockquote>]]></content><author><name></name></author><category term="BeOS" /><category term="projects" /><summary type="html"><![CDATA[This is a recreation of the famous BeOS “BUY NOW” screensaver for macOS. It has a dark blue background and white text.]]></summary></entry><entry><title type="html">How to disable Siri reply suggestions in Messages on macOS</title><link href="https://jamiedubs.com/blog/how-to-disable-siri-auto-replies-in-macos-messages/" rel="alternate" type="text/html" title="How to disable Siri reply suggestions in Messages on macOS" /><published>2025-09-10T00:00:00-04:00</published><updated>2025-09-10T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/how-to-disable-siri-auto-replies-in-macos-messages</id><content type="html" xml:base="https://jamiedubs.com/blog/how-to-disable-siri-auto-replies-in-macos-messages/"><![CDATA[<p>I hate these Siri suggested replies in the Messages app in macOS 15+ (Sequioa). This post has a fix that actually works.</p>

<p><img src="/images/blog-posts/messages-suggested-replies-1.png" alt="Screenshoot of auto-suggested replies in macOS Messages app" /></p>

<p>To disable these annoying auto-replies, go to <code class="language-plaintext highlighter-rouge">System Settings &gt; Keyboard &gt; Input Sources &gt; Text Input</code> and disable “Suggested Replies”</p>

<p><img src="/images/blog-posts/messages-suggested-replies-2.png" alt="Screenshot of 'Keyboard' system settings dialog" /></p>

<p><img src="/images/blog-posts/messages-suggested-replies-3.png" alt="Screenshot of 'Text Inputs' dialog inside Keyboard system settings, with 'Suggested Replies toggle" /></p>

<p>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.</p>

<p>There’s a bunch of Apple support threads and <a href="https://www.reddit.com/r/applehelp/comments/1ikuiux/how_do_i_turn_off_messages_prompts_macbook_air/">this reddit thread</a> but instructions were incorrect, so here we are! Good luck</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I hate these Siri suggested replies in the Messages app in macOS 15+ (Sequioa). This post has a fix that actually works.]]></summary></entry><entry><title type="html">Computers controlling web browsers</title><link href="https://jamiedubs.com/blog/computers-controlling-web-browsers/" rel="alternate" type="text/html" title="Computers controlling web browsers" /><published>2025-04-01T00:00:00-04:00</published><updated>2025-04-01T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/computers-controlling-web-browsers</id><content type="html" xml:base="https://jamiedubs.com/blog/computers-controlling-web-browsers/"><![CDATA[<p>Amazon launched <a href="https://labs.amazon.science/blog/nova-act">Nova Act</a> yesterday, which is their “control a web browser with an LLM” solution. This is comparable to <a href="https://openai.com/index/introducing-operator/">GPT Operator</a>, <a href="https://docs.anthropic.com/en/docs/agents-and-tools/computer-use">Claude Computer Use</a> and <a href="https://openinterpreter.com/">Open Interpreter</a> (the last is my favorite, and open-source)</p>

<p>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.</p>

<p>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. <a href="https://playwright.dev/">Playwright</a>, <a href="https://pptr.dev/">Puppeteer</a>, <a href="https://www.rabbit.tech/">Rabbit r1</a> (lol), plus hosted solutions like <a href="https://browserbase.com/">BrowserBase</a>, <a href="https://www.checklyhq.com/">Checkly</a>, and <a href="https://anon.com/">Anon</a> (the last is my favorite)</p>

<p>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.</p>

<p>Websites that <em>don’t</em> 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.</p>

<p>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.</p>

<p>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</p>

<p>This post also on:</p>

<ul>
  <li><a href="https://x.com/jamiew/status/1907121203195576446">Twitter/X</a></li>
  <li><a href="https://bsky.app/profile/jamiew.bsky.social/post/3llrf5t3mnc2k">Bluesky</a></li>
  <li><a href="https://warpcast.com/jamiew/0x497d9ea7">Farcaster</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Amazon 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)]]></summary></entry><entry><title type="html">AI-assisted code tools of the now</title><link href="https://jamiedubs.com/blog/ai-code-tools-power-summary-stack-rank/" rel="alternate" type="text/html" title="AI-assisted code tools of the now" /><published>2025-03-27T00:00:00-04:00</published><updated>2025-03-27T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/ai-code-tools-power-summary-stack-rank</id><content type="html" xml:base="https://jamiedubs.com/blog/ai-code-tools-power-summary-stack-rank/"><![CDATA[<p>By 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.</p>

<ul>
  <li>low-code: <a href="https://lovable.dev/">Lovable</a>, <a href="https://bolt.new/">Bolt</a>, <a href="https://v0.dev">Vercel v0</a></li>
  <li>mid-code: <a href="https://www.val.town/">Val.town</a>, <a href="https://replit.com">Replit</a></li>
  <li>full-code: <a href="https://cline.bot/">Cline</a>, <a href="https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview">Claude Code</a>, <a href="https://codeium.com/windsurf">Windsurf</a>, <a href="https://www.cursor.com">Cursor</a>, <a href="https://aider.chat/">Aider</a></li>
</ul>

<p>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  <a href="https://simonwillison.net/2025/Mar/19/vibe-coding/">simonw’s interpretation</a> of the og <a href="https://x.com/karpathy/status/1886192184808149383">Karpathy</a>.</p>

<p>I’m not including no-code things like <a href="https://glif.app">Glif</a>, <a href="https://chatgpt.com/gpts">GPTs</a>, <a href="https://n8n.io">n8n</a> or various mixed-agent-builder platforms etc which are a different post.</p>

<p>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 <a href="https://supabase.com">Supabase</a> 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</p>

<p>Valtown is the “mid-code” part of the spectrum. You’re looking at code, but the AI assistant <a href="https://val.town/townie">Townie</a> 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 <a href="https://blog.val.town/blog/projects/">Valtown Projects</a> 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</p>

<p>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.</p>

<p>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 &amp; 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 <a href="https://jamiedubs.com/blog/llm-plugins-and-the-state-of-mcp/">MCP servers</a> too. Aider is the most hardcore, super powerful, much more involved but produces amazing results if you know what you’re doing.</p>

<p>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.</p>

<p>Lastly, everything in this post will be out-of-date as soon as I press publish. generative AI is nuts rn</p>]]></content><author><name></name></author><summary type="html"><![CDATA[By 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.]]></summary></entry><entry><title type="html">LLM plugins and the state of MCP</title><link href="https://jamiedubs.com/blog/llm-plugins-and-the-state-of-mcp/" rel="alternate" type="text/html" title="LLM plugins and the state of MCP" /><published>2025-03-21T00:00:00-04:00</published><updated>2025-03-21T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/llm-plugins-and-the-state-of-mcp</id><content type="html" xml:base="https://jamiedubs.com/blog/llm-plugins-and-the-state-of-mcp/"><![CDATA[<p>Lots of hype and debunking around <a href="https://modelcontextprotocol.io">MCP (Model Context Protocol)</a> flying around lately. I’ve been working with it since launch and believe all of these are true:</p>

<ol>
  <li>
    <p>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 shortcomings<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> <sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>, but out of the gate it has some serious issues.</p>
  </li>
  <li>
    <p>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.</p>
  </li>
</ol>

<p>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 <a href="https://llmstxt.org/">llms-full.txt</a>. I’m willing to bet the LLM plugins (the MCP servers) will quickly become the most popular way to interact with those APIs.</p>

<p>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 <a href="https://x.com/sidahuj/status/1899460492999184534">Blender MCP</a> and <a href="https://www.youtube.com/watch?v=VH9g66e42XA">Ableton Live MCP</a>.</p>

<p>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.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Stateless MCPs using normal streaming HTTP: <a href="https://github.com/modelcontextprotocol/specification/pull/206">https://github.com/modelcontextprotocol/specification/pull/206</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>OAuth in MCP: <a href="https://spec.modelcontextprotocol.io/specification/draft/basic/authorization/">https://spec.modelcontextprotocol.io/specification/draft/basic/authorization/</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><summary type="html"><![CDATA[Lots 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:]]></summary></entry><entry><title type="html">The Demo Rules</title><link href="https://jamiedubs.com/blog/def-demo-rules/" rel="alternate" type="text/html" title="The Demo Rules" /><published>2023-10-11T00:00:00-04:00</published><updated>2023-10-11T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/def-demo-rules</id><content type="html" xml:base="https://jamiedubs.com/blog/def-demo-rules/"><![CDATA[<p>I love demos. These are the rules we used for the bi-weekly demo sessions at <a href="https://twitter.com/defdao">DEF</a>. “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:</p>

<h2 id="the-demo-rules">The Demo Rules</h2>

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

<h2 id="bonus">Bonus</h2>

<ul>
  <li>Turn on your video if you’re willing. Otherwise we are all just random usernames on the Internet</li>
  <li>Demos are default-private. Please don’t post other people’s work on social media w/o permission. we post a few screenshots in <code class="language-plaintext highlighter-rouge">#mouths-only-sidechat</code> 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</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[I 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:]]></summary></entry><entry><title type="html">How to be a Helium price oracle</title><link href="https://jamiedubs.com/blog/how-to-be-an-hnt-price-oracle/" rel="alternate" type="text/html" title="How to be a Helium price oracle" /><published>2021-11-22T00:00:00-05:00</published><updated>2021-11-22T00:00:00-05:00</updated><id>https://jamiedubs.com/blog/how-to-be-an-hnt-price-oracle</id><content type="html" xml:base="https://jamiedubs.com/blog/how-to-be-an-hnt-price-oracle/"><![CDATA[<p><strong>The Helium Network Wants YOU To Submit HNT Prices Regularly</strong>
<strong>(It’s Easier Than You Think)</strong></p>

<h2 id="background">Background</h2>

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

<p>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:</p>

<p><img src="/images/blog/how-to-be-an-hnt-price-oracle/s_azdzrx0qvc88p4g_screen_20shot_202021-07-27_20at_2022-40-45_20oracles_20_C2_B7_20dashboard_20_C2_B7_20metabase_201.png" alt="" /></p>

<p>Here’s what it looks like when the number of voting oracles falls below a majority, represented by the the dashed threshold line (data &amp; graph from <a href="https://etl.dewi.org/public/dashboard/377b53e9-d4ed-48f0-9352-9285ad56461e">DeWi ETL</a>)</p>

<p><img src="/images/blog/how-to-be-an-hnt-price-oracle/s_0gy09qtmjz5e2wx_screen_20shot_202021-07-27_20at_2022-42-24_2001-46_20_C2_B7_20oracles_20_C2_B7_20dashboard_20_C2_B7_20" alt="" /></p>

<p>Read more about oracles <a href="https://docs.helium.com/blockchain/oracles/">on docs.helium.com</a> and then check out all the sick charts of oracles (allegedly) submitting prices on the <a href="https://etl.dewi.org/public/dashboard/377b53e9-d4ed-48f0-9352-9285ad56461e">DeWi ETL Oracles dashboard</a></p>

<h2 id="setup">Setup</h2>

<p>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.</p>

<ol>
  <li>Download and install the commandline <a href="https://github.com/helium/helium-wallet-rs">helium-wallet</a></li>
  <li>Create a fresh mainnet wallet</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helium-wallet create basic
Password: [unique long top secret password]
Confirm: [unique long top secret password]
</code></pre></div></div>
<ol>
  <li>Backup that new <code class="language-plaintext highlighter-rouge">wallet.key</code> keyfile somewhere super duper safe</li>
  <li>Send the wallet address to your top secret handler. I don’t know who this is, don’t ask.</li>
</ol>

<h2 id="submit-prices">Submit prices</h2>

<p>Helium has made this very easy. Thank you Louis. You don’t even need to look up the HNT price – you can use <code class="language-plaintext highlighter-rouge">helium-wallet</code> to automatically fetch and submit the latest price from Coingecko, Bilaxy or Binance:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helium-wallet oracle report --block auto --price coingecko --commit
</code></pre></div></div>

<p>This assumes the <code class="language-plaintext highlighter-rouge">wallet.key</code> is in the same directory. Use <code class="language-plaintext highlighter-rouge">-f ~/path/to/oracle-wallet.key</code> otherwise.</p>

<p>Lastly, setup a script to automatically submit prices on a regular basis. You can use the <code class="language-plaintext highlighter-rouge">HELIUM_WALLET_PASSWORD</code> environment variable to automatically enter your wallet password; keep this safe.</p>

<p>Here is a basic shell script:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#!/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&gt;&amp;1 &amp;&amp; break
  n=$((n+1))
  sleep 5
done
</code></pre></div></div>

<p>Then throw it in your crontab (<code class="language-plaintext highlighter-rouge">crontab -e</code>):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Submit HNT prices hourly
@hourly   /home/pi/bin/helium-oracle-submit | grep -v "timed out" &gt;/dev/null
</code></pre></div></div>

<h2 id="you-did-it">You did it</h2>

<p>Please contact me (email and Discord username are on <a href="https://jamiedubs.com">jamiedubs.com</a>) 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!</p>

<p>Thank you for your service</p>]]></content><author><name></name></author><category term="helium" /><summary type="html"><![CDATA[The Helium Network Wants YOU To Submit HNT Prices Regularly (It’s Easier Than You Think)]]></summary></entry><entry><title type="html">Go pitch yourself</title><link href="https://jamiedubs.com/blog/go-pitch-yourself/" rel="alternate" type="text/html" title="Go pitch yourself" /><published>2021-10-27T00:00:00-04:00</published><updated>2021-10-27T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/go-pitch-yourself</id><content type="html" xml:base="https://jamiedubs.com/blog/go-pitch-yourself/"><![CDATA[<p>If 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.</p>

<p>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.</p>

<p>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.</p>

<p>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.</p>

<p>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)</p>

<p>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.</p>

<p>I started doing this “pitch myself” idea based on a suggestion from <a href="https://twitter.com/dianakimball">Diana Kimball Berlin</a>, 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.</p>]]></content><author><name></name></author><category term="startups" /><category term="public speaking" /><summary type="html"><![CDATA[If 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.]]></summary></entry><entry><title type="html">Hacking PartyBid to bid on unsupported Foundation Collections</title><link href="https://jamiedubs.com/blog/how-to-partybid-on-a-foundation-collection-piece/" rel="alternate" type="text/html" title="Hacking PartyBid to bid on unsupported Foundation Collections" /><published>2021-10-07T00:00:00-04:00</published><updated>2021-10-07T00:00:00-04:00</updated><id>https://jamiedubs.com/blog/how-to-partybid-on-a-foundation-collection-piece</id><content type="html" xml:base="https://jamiedubs.com/blog/how-to-partybid-on-a-foundation-collection-piece/"><![CDATA[<p><img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_477wgju23wfutre_screen_20shot_202021-10-07_20at_2017-52-32_20microcosm_2022_20_20foundation.jpg" alt="" /></p>

<p>So you want to <a href="https://partybid.app">partybid</a> on something in the cool new <a href="https://foundation.app/collection">Foundation Collections</a>, but the PartyBid frontend doesn’t support it? And the auction is over in 12 hours you say?</p>

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

<p>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 <a href="https://foundation.app/@JenStark_Vault/cosmos/22">Microcosm #22</a></p>

<p>I wrote up this HOWTO for <a href="https://twitter.com/sirsuhayb/">Sirsu</a> but thought it might be helpful for everyone else trying to do this &lt;3</p>

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

<ol>
  <li>Dig up the NFT contract address, token ID and auction ID</li>
  <li>Deploy a PartyBid contract instance using Etherscan</li>
  <li><del>Deploy your own version of the <a href="https://github.com/shahruz/defparty">custom web frontend</a></del> – <strong>UPDATE:</strong> thanks to SteveK, the partybid.app frontend now supports custom contracts</li>
</ol>

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

<h2 id="deploy-a-partybid-contract-instance">Deploy a PartyBid contract instance</h2>

<ol>
  <li>Choose an artwork, fund your wallet and rally your posse</li>
</ol>

<p>For Sirsu this is <a href="https://foundation.app/@yatreda/taitu/10">https://foundation.app/@yatreda/taitu/10</a> (awesome piece)</p>

<ol>
  <li>Find the piece you want on Foundation and copy its custom contract URL:</li>
</ol>

<p><img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_jng0fw6cr8vvgy7_screen_20shot_202021-10-07_20at_2017-11-55_20gudit_20kingdoms_20of_20ethiopia_20foundation.png" alt="" /></p>

<p>in this case:
<code class="language-plaintext highlighter-rouge">0x814A056F1607C7F43285a1a1de43755Ed3b26eE7</code></p>

<ol>
  <li>Look up the tokenID – this is generally in the link from Foundation too</li>
</ol>

<p>%%!Screen Shot 2021-10-07 at 17-17-00 Kingdoms of Ethiopia (TAITU) Token Tracker Etherscan.png
%%
<img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_jbx6sdpy0hawjl8_screen_20shot_202021-10-07_20at_2017-17-00_20kingdoms_20of_20ethiopia_20_28taitu_29_20token_20tracker_" alt="" /></p>

<p>Ours is <code class="language-plaintext highlighter-rouge">10</code></p>

<ol>
  <li>Look up the Foundation auction ID for that specific token</li>
</ol>

<p>I visit the Foundation <code class="language-plaintext highlighter-rouge">Market</code> contract on Etherscan to look this up:
0xcDA72070E455bb31C7690a170224Ce43623d0B6f</p>

<p><a href="https://etherscan.io/address/0xcda72070e455bb31c7690a170224ce43623d0b6f#readProxyContract">https://etherscan.io/address/0xcda72070e455bb31c7690a170224ce43623d0b6f#readProxyContract</a></p>

<p>Use the <code class="language-plaintext highlighter-rouge">getReserveAuctionIdFor</code> function and put in your NFT contract from step 2 and your token ID from step 3</p>

<p>%%!Screen Shot 2021-10-07 at 17-22-30 Foundation Market 0xcDA72070E455bb31C7690a170224Ce43623d0B6f.png
%%
<img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_6tc8di638mt1cgd_screen_20shot_202021-10-07_20at_2017-22-30_20foundation_20market_200xcda72070e455bb31c7690a170224ce436" alt="" /></p>

<p>Ours is <code class="language-plaintext highlighter-rouge">97237</code></p>

<p>Now you have your arguments for the <code class="language-plaintext highlighter-rouge">startParty</code> contract call:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>_marketWrapper (address):  0x96e5b0519983f2f984324b926e6d28C3A4Eb92A1
_nftContract (address) 0x814A056F1607C7F43285a1a1de43755Ed3b26eE7
_tokenId (uint256) 10
_auctionId (uint256) 97237
_splitRecipient (address) 0x0000000000000000000000000000000000000000
_splitBasisPoints (uint256) 0
_name (string): WhateverYouWant
_symbol (string): WHATEVERUWANT
</code></pre></div></div>

<p>Time to deploy a PartyBid instance!</p>

<p>Visit the PartyBidFactory contract on Etherscan:
<a href="https://etherscan.io/address/0xAba3506DDF718278632B245ad0d86BB81070BA47#code">https://etherscan.io/address/0xAba3506DDF718278632B245ad0d86BB81070BA47#code</a></p>

<p>Fill in the values you dug up:</p>

<p>%%!Screen Shot 2021-10-07 at 17-24-49 PartyBidFactory 0xAba3506DDF718278632B245ad0d86BB81070BA47.png
%%
<img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_3s4ka0ogr8fd9va_screen_20shot_202021-10-07_20at_2017-24-49_20partybidfactory_200xaba3506ddf718278632b245ad0d86bb81070b" alt="" /></p>

<p>Write contact and hold onto your butts!</p>

<h2 id="deploy-the-lofi-custom-frontend">Deploy the lofi custom frontend</h2>

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

<p>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 <a href="https://twitter.com/shahruz">Shahruz</a> wrote in like 30 minutes:</p>

<p><a href="https://github.com/shahruz/defparty">https://github.com/shahruz/defparty</a></p>

<p>The fastest ways to deploy this are setting it up on <a href="https://www.vercel.com">Vercel</a> or <a href="https://netlify.com">Netlify</a>. 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.</p>

<p>The frontend we used to win Microcosmos #22 is here as an example: <a href="https://defparty.netlify.app/">https://defparty.netlify.app/</a></p>

<p><img src="/images/blog/how-to-partybid-on-a-foundation-collection-piece/s_oa1dwgq58z46lrl_screen_20shot_202021-10-07_20at_2017-47-27_20mozilla_20firefox.png" alt="" /></p>

<p>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 <em>completely</em> sketchy website:</p>

<p><a href="https://github.com/shahruz/defparty/blob/main/src/pages/index.tsx">https://github.com/shahruz/defparty/blob/main/src/pages/index.tsx</a></p>

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

<p>Big thank you to <a href="https://twitter.com/steveklbnf">Steve Klebenoff</a>, <a href="https://twitter.com/shahruz">Shahruz</a>, <a href="https://twitter.com/mattlehrer/">Matt Lehrer</a>, everyone in Definitely Crypto, everyone else who participated in this PartyBid, and especially <a href="https://twitter.com/jen_stark">Jen Stark</a> for the beautiful work!</p>]]></content><author><name></name></author><category term="crypto" /><category term="nfts" /><category term="partydao" /><category term="foundation" /><summary type="html"><![CDATA[]]></summary></entry></feed>