<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Jeremy G]]></title><description><![CDATA[Musings from Jeremy]]></description><link>https://www.jeremyg.dev/</link><image><url>https://www.jeremyg.dev/favicon.png</url><title>Jeremy G</title><link>https://www.jeremyg.dev/</link></image><generator>Ghost 6.43</generator><lastBuildDate>Wed, 03 Jun 2026 11:30:19 GMT</lastBuildDate><atom:link href="https://www.jeremyg.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[K-Shaped AI Adoption]]></title><description><![CDATA[Everyone thinks they're behind on AI.

But after speaking with hundreds of engineers and leaders, I’m seeing something interesting: AI adoption inside organizations is becoming K-shaped.]]></description><link>https://www.jeremyg.dev/k-shaped-ai-adoption/</link><guid isPermaLink="false">69ac60046239400001a838f2</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Mon, 09 Mar 2026 11:18:23 GMT</pubDate><content:encoded><![CDATA[<p>AI is transforming how we work, the way we communicate, and even the way we make decisions. I use it daily for many different things, both personally and professionally. If you&apos;re reading this, I imagine you do too.</p><p>I&apos;m lucky to be in a role where I get to speak with a huge number of people. From CxOs and founders to fellow board members to practitioners from a very wide variety of industries, companies, and disciplines. This enables me to spot patterns. One thing I hear consistently: <em>everyone thinks they are behind when it comes to AI</em>.</p><p>But digging in one level deeper, I&apos;m seeing something more interesting inside many organizations: <strong>AI adoption is becoming K-shaped</strong></p><p>AI isn&apos;t just increasing productivity. <em>It&apos;s increasing the variance in productivity between engineers.</em></p><p>Some engineers are enthusiastic adopters. Even if they haven&apos;t gone full gas town, they have mature harnesses set up, have adopted AI into most facets of their work, and are seeing real productivity gains. They&apos;re starting to trust the output, and as a result are fundamentally changing how they work. </p><p>Some engineers on the other hand have been very slow to adopt, or are not adopting at all.</p><p>What&#x2019;s striking is that I see this pattern across a wide variety of organizations. Startups, large tech companies, traditional enterprises... almost everywhere outside AI-native companies. The divide often appears within the same team.</p><p>Some of the hesitation is understandable. I often hear valid concerns around topics like environmental impact. Sometimes it&apos;s fear, uncertainty, doubt. Many are skeptical of the output itself.</p><p>But I don&#x2019;t think those factors fully explain what&#x2019;s happening. I&apos;ve talked to people who share those concerns but are still huge adopters, and others who have none of those concerns but still avoid using AI in their work. Company culture and seniority do not appear to be consistent factors.</p><p>Part of it comes down to mental plasticity and curiosity, sure. Change can be uncomfortable. But I think there&apos;s something deeper going on. </p><p>For many engineers, it comes down to <em>how they think about coding itself and what impact that has on their identity</em>.</p><p>For some people, and I am very much in this camp, coding has always been about outcomes. It&apos;s about solving a problem and building something useful. Code is a tool. We&apos;re <strong>builders</strong>. </p><p>For builders, coding agents have been an amazing accelerant. They allow us to move faster, try more ideas, and get more things into the world. As I said in a previous post, I&apos;m having more fun than I&apos;ve had in a long time. </p><p>But for others, code is a craft. </p><p>Writing clean, elegant code or honing an algorithm is part of who they are. Thinking deeply about implementation details is where they find joy. These engineers are <strong>artisans</strong>. </p><p>For this group, AI agents aren&apos;t just a productivity tool. In some ways they are literally destroying the part of coding artisans find joy in. </p><p>A builder looks at a project coded mostly (completely?) by an AI agent and says: &quot;Look how fast I was able to solve this problem&quot;</p><p>An artisan looks at the same project and says: &quot;Sure, but look at the logic in this part of the code, and what is happening on line 181??&quot;</p><p>I&apos;m not sure what the future holds. The current range of plausible outcomes seems very wide. But the coding agent is not going back in the box. Software development has been changed forever, and it&apos;s very likely we&apos;re only getting started. </p><p>Do artisans adapt, finding joy in the architecture and systems they design for agents to implement? Will they prefer to use their skills in other industries or occupations?</p><p>Is AI creating a <strong>Builder-Artisan divide</strong> in software engineering? I&apos;m genuinely not sure.</p><p>But the growing divide in how engineers are approaching AI feels like a conversation worth having. AI may not replace engineers, <em>but it may change which engineers thrive</em>.</p><p>What I do know is that we&apos;re in this together.</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[The A Million Pixels Tech Stack]]></title><description><![CDATA[<p>(Another repost from the <a href="https://www.amillionpixels.ai/blog/the-a-million-pixels-tech-stack?ref=jeremyg.dev" rel="noreferrer">A Million Pixels blog</a>.)</p><p>In my <a href="https://www.jeremyg.dev/why-i-built-a-million-pixels/" rel="noreferrer">first post</a>, I talked about <em>why</em> I built A Million Pixels. As I <a href="https://x.com/linuxquestions/status/2024855216051433500?ref=jeremyg.dev">mentioned here</a>, one of the most common questions I got after the launch was: what stack is this built on and who made those decisions? This post</p>]]></description><link>https://www.jeremyg.dev/the-a-million-pixels-tech-stack/</link><guid isPermaLink="false">699e357e9081dc0001b70241</guid><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Tue, 24 Feb 2026 23:38:36 GMT</pubDate><content:encoded><![CDATA[<p>(Another repost from the <a href="https://www.amillionpixels.ai/blog/the-a-million-pixels-tech-stack?ref=jeremyg.dev" rel="noreferrer">A Million Pixels blog</a>.)</p><p>In my <a href="https://www.jeremyg.dev/why-i-built-a-million-pixels/" rel="noreferrer">first post</a>, I talked about <em>why</em> I built A Million Pixels. As I <a href="https://x.com/linuxquestions/status/2024855216051433500?ref=jeremyg.dev">mentioned here</a>, one of the most common questions I got after the launch was: what stack is this built on and who made those decisions? This post answers those questions.</p><p>Some context: The idea was mine, with no AI involved in the equation. The overwhelming majority of the code was written with agentic coding tools (primarily Claude Code and Codex). The stack reflects decisions made solely by me, mostly by the agent, or collaboratively. That last bit feels a little weird to write. I can cover the agentic workflow in detail in a future post if it&apos;s interesting to readers.</p><h2 id="the-life-of-a-pixel">The Life of a Pixel</h2><p>Here&apos;s a simplified view of the architecture:</p><pre><code>                         &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
                         &#x2502;   Browser   &#x2502;
                         &#x2502;  (PixiJS)   &#x2502;
                         &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                                &#x2502;
                         &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
                         &#x2502;   Vercel    &#x2502;
                         &#x2502;  Next.js 16 &#x2502;
                         &#x2514;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2518;
                            &#x2502;   &#x2502;   &#x2502;
              &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;   &#x2502;   &#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
              &#x2502;             &#x2502;   &#x2502;   &#x2502;             &#x2502;
       &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
       &#x2502;   Stripe    &#x2502; &#x2502;   Supabase    &#x2502; &#x2502;  Replicate   &#x2502;
       &#x2502;  Checkout   &#x2502; &#x2502;  (Postgres)   &#x2502; &#x2502;  (AI Images) &#x2502;
       &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                            &#x2502;   &#x2502;   &#x2502;
              &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;   &#x2502;   &#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
              &#x2502;             &#x2502;   &#x2502;   &#x2502;             &#x2502;
       &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2500;&#x2510;  &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BC;&#x2500;&#x2500;&#x2510;
       &#x2502;  Upstash    &#x2502; &#x2502;  OpenAI   &#x2502;  &#x2502; Cloudflare  &#x2502;
       &#x2502;   Redis     &#x2502; &#x2502; Moderation&#x2502;  &#x2502;     R2      &#x2502;
       &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;  &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><p>Payment &#x2192; generation &#x2192; moderation &#x2192; storage &#x2192; canvas. That&apos;s the core loop. Everything else supports it.</p><h2 id="the-stack-at-a-glance">The Stack at a Glance</h2>
<!--kg-card-begin: html-->
<table>
<thead>
<tr>
<th>Technology</th>
<th>What It Does</th>
</tr>
</thead>
<tbody>
<tr>
<td>Vercel</td>
<td>Hosting and deployment</td>
</tr>
<tr>
<td>Next.js 16 + React 19</td>
<td>App framework and UI</td>
</tr>
<tr>
<td>TypeScript</td>
<td>Type safety across the entire codebase</td>
</tr>
<tr>
<td>Tailwind CSS 4 + shadcn/ui</td>
<td>Styling and component library</td>
</tr>
<tr>
<td>Supabase (PostgreSQL)</td>
<td>Database with row-level security</td>
</tr>
<tr>
<td>Upstash Redis</td>
<td>Caching and rate limiting</td>
</tr>
<tr>
<td>Stripe Checkout</td>
<td>Payment processing</td>
</tr>
<tr>
<td>Replicate (SDXL, Flux 2 Pro)</td>
<td>AI image generation</td>
</tr>
<tr>
<td>OpenAI</td>
<td>Text moderation and embeddings</td>
</tr>
<tr>
<td>Sightengine</td>
<td>Image moderation</td>
</tr>
<tr>
<td>Google Web Risk</td>
<td>URL safety checking</td>
</tr>
<tr>
<td>Cloudflare R2</td>
<td>Object storage for generated images</td>
</tr>
<tr>
<td>Resend + React Email</td>
<td>Transactional email</td>
</tr>
<tr>
<td>PixiJS 8</td>
<td>Canvas rendering</td>
</tr>
<tr>
<td>BotId + Cloudflare Turnstile</td>
<td>Bot protection</td>
</tr>
<tr>
<td>Supabase Auth (GitHub OAuth)</td>
<td>User authentication</td>
</tr>
<tr>
<td>Datadog + OpenTelemetry</td>
<td>Observability (APM, RUM, logs)</td>
</tr>
<tr>
<td>GitHub Actions</td>
<td>CI/CD pipeline</td>
</tr>
<tr>
<td>MDX (next-mdx-remote)</td>
<td>This blog</td>
</tr>
</tbody>
</table>
<!--kg-card-end: html-->
<p>Now let&apos;s dig into each one.</p><h2 id="hosting-deployment">Hosting &amp; Deployment</h2><p><strong>Vercel</strong></p><p>This is the first decision I made, as it impacted so many other decisions. I considered Railway, Render and Vercel. They all looked compelling. In the end, Render and Railway looked more like the infra platforms I&apos;ve used in the past, so I went with Vercel. I&apos;ve since delpoyed apps on both Railway and Render, and both are solid. You should decide based on the strengths of each platform vs your needs (ie. Choose Vercel you&apos;re building a frontend-heavy site or using Next.js. Choose Railway if you need a fast, simple backend deployment and quick DB setup. Choose Render if you have a traditional full-stack app requiring a persistent server and want predictable costs.)</p><p>Vercel is the company behind Next.js, and the deployment experience reflects that. Push to a branch, get a preview deployment. Merge to main, get a production deployment. The developer experience really is great. Serverless functions, edge middleware, image optimization, and cron jobs are all built in.</p><p><strong>Alternatives considered</strong>: Railway, Render</p><h2 id="core-framework">Core Framework</h2><p><strong>Next.js 16, React 19, TypeScript, Tailwind CSS 4, shadcn/ui</strong></p><p>Next.js was the obvious choice for a project like this once I decided on Vercel. Server Components by default, the App Router, API routes, and middleware all in one framework. React 19 brings Server Actions and improved streaming, which simplify a lot of the data flow.</p><p>TypeScript was a collaborative choice, although one of the the Agents said using it &quot;is non-negotiable for anything beyond a toy project. When you&apos;re collaborating with AI agents that generate a lot of code, type safety acts as a persistent guardrail. The compiler catches mistakes that neither you nor the agent noticed.&quot; What&apos;s interesting about this is that until I added an explict line about types to my CLAUDE.md and AGENTS.md, they constantly used &quot;any&quot;.</p><p>Tailwind CSS 4 paired with <a href="https://ui.shadcn.com/?ref=jeremyg.dev">shadcn/ui</a>, was completely chosen by the Agents.</p><p><strong>Alternatives considered</strong>: Remix, SvelteKit. Both are fine options, but once I decided on Vercel a lot of this just fell into place.</p><h2 id="database">Database</h2><p><strong>Supabase (PostgreSQL with Row-Level Security)</strong></p><p>Supabase gives you a managed Postgres database with a great developer experience: auto-generated REST APIs via PostgREST, real-time subscriptions, and built-in auth. I use it as a straightforward database &#x2014; no ORMs, just the Supabase client with typed queries.</p><p>Row-Level Security (RLS) means the database itself enforces access rules. Even if you screw up an API route, the database won&apos;t return data the caller shouldn&apos;t see. It&apos;s defense in depth, and it&apos;s one of Supabase&apos;s strongest selling points.</p><p>Migrations are forward-only and backward-compatible by design. Every schema change has to work with both the current and previous code version, because code deploys can roll back but migrations can&apos;t. This is a discipline worth adopting early. Migrations are automatically handled by the CI/CD pipeline.</p><p><strong>Alternatives considered</strong>: PlanetScale, Neon, raw Postgres. I&apos;ve been looking for an excuse to trying Supabase in earnest and this was it.</p><h2 id="cache">Cache</h2><p><strong>Upstash Redis</strong></p><p>Upstash provides serverless Redis, and has native Vercel integration. It&apos;s used for rate limiting, caching (including AI embedding results), and cross-instance coordination for things like circuit breaker state.</p><p>The per-request pricing model means you&apos;re not paying for idle connections. For a project with variable traffic, this matters more than you&apos;d think.</p><p><strong>Alternatives considered</strong>: Vercel KV (which is actually Upstash under the hood), Momento, DynamoDB. Upstash directly gives you the most control and the best pricing transparency. The Vercel 1 click made the decision for me.</p><h2 id="payments">Payments</h2><p><strong>Stripe Checkout</strong></p><p>Stripe Checkout is a hosted payment page that handles the entire purchase flow. You redirect the user to Stripe, they pay, and you get a webhook when it&apos;s done.</p><p>For a project like this where the purchase flow is straightforward (select a block, pay $1/pixel, get an image), Checkout is ideal. It&apos;s PCI compliant by default, handles international payment methods, and the webhook model makes the backend integration clean and idempotent.</p><p>The Stripe API version is pinned to match the SDK&apos;s type definitions. This is a small thing, but it prevents subtle runtime bugs from API version drift.</p><p><strong>Alternatives considered</strong>: I just chose Stripe, it&apos;s what I know. I works. It has great docs.</p><h2 id="ai-image-generation">AI Image Generation</h2><p><strong>Replicate (SDXL, Flux 2 Pro)</strong></p><p>This is the core of the product. A user writes a prompt, and an AI model generates a unique image for their block on the canvas.</p><p>I use <a href="https://replicate.com/?ref=jeremyg.dev">Replicate</a> as the inference provider because it gives you access to multiple models through a single API. The site currently supports two models &#x2014; SDXL and Flux 2 Pro &#x2014; with model selection driven by feature flags. This lets me A/B test different models and roll out new ones without code changes.</p><p>The generation flow is asynchronous: the API kicks off a prediction, and Replicate sends a webhook when it&apos;s complete. This decouples the user-facing request from the potentially slow generation step.</p><p><strong>Alternatives considered</strong>: Running models directly on GPU instances (too expensive and complex to manage), DALL-E (good but less model flexibility), Midjourney (no API at the time I started building). This was a collaborative choice, as it was not an area I had much experience.</p><h2 id="ai-embeddings">AI Embeddings</h2><p><strong>OpenAI (text-embedding-3-small)</strong></p><p>Every prompt submitted to the site gets an embedding &#x2014; a 1536-dimensional vector that captures the semantic meaning of the text. This powers semantic search and content discovery across blocks.</p><p>I chose <code>text-embedding-3-small</code> for the balance of quality and cost. Embeddings are cached in Redis with a content-addressed key (SHA256 of normalized text), so duplicate or near-duplicate prompts don&apos;t generate redundant API calls.</p><p><strong>Alternatives considered</strong>: Cohere Embed, Voyage AI, open-source models via Hugging Face. I was already using OpenAI for moderation, so it didn&apos;t seem worth adding another service to the equation for this.</p><h2 id="content-moderation">Content Moderation</h2><p><strong>OpenAI Moderation + Sightengine + Google Web Risk</strong></p><p>Moderation is a three-layer system, because no single service catches everything, and I&apos;ve learned the importance of automated moderation the hardway with LinuxQuestions.org.</p><ol><li><strong>Text moderation</strong> &#x2014; OpenAI&apos;s moderation endpoint analyzes every prompt before image generation begins. It&apos;s fast, cheap, and catches the obvious stuff.</li><li><strong>Image moderation</strong> &#x2014; After an image is generated, <a href="https://sightengine.com/?ref=jeremyg.dev">Sightengine</a> runs computer vision analysis across multiple categories (nudity, violence, etc.). Text moderation alone isn&apos;t enough because the same prompt can produce very different images depending on the model and seed.</li><li><strong>URL safety</strong> &#x2014; Any user-submitted URLs are checked against <a href="https://cloud.google.com/web-risk?ref=jeremyg.dev">Google Web Risk</a> to prevent phishing and malware links.</li></ol><p>On top of these, there&apos;s a pattern-based detection layer for common jailbreak and prompt injection attempts. When detected, these route to manual review rather than auto-rejection &#x2014; defense in depth without punishing false positives.</p><p>Each external moderation service has its own circuit breaker with exponential backoff. When a service degrades, new requests route to manual review instead of blocking users or silently skipping moderation. Circuit breaker state is persisted in Redis so it&apos;s coordinated across all serverless instances. I probably went overboard here, but again... lessons learned.</p><p><strong>Alternatives considered</strong>: AWS Rekognition, Azure Content Safety, building everything with OpenAI&apos;s vision models. The multi-provider approach adds complexity but significantly reduces the risk of any single point of failure in moderation.</p><h2 id="object-storage">Object Storage</h2><p><strong>Cloudflare R2</strong></p><p>Generated images need to live somewhere, and Cloudflare R2 is S3-compatible storage with zero egress fees. That last part is the key differentiator &#x2014; for a site that serves a lot of images, egress costs on S3 or GCS add up fast.</p><p>The integration uses the standard AWS S3 SDK pointed at R2&apos;s endpoint. If I ever need to migrate to S3 or another S3-compatible service, the code changes are minimal.</p><p>NOTE: While I don&apos;t use the main Cloudflare service for A Million Pixels, they do donate the service to LQ and honestly the site wouldn&apos;t be viable at this point without it.</p><p><strong>Alternatives considered</strong>: AWS S3, Vercel Blob, Supabase Storage. R2 won on cost (zero egress) and S3 compatibility.</p><h2 id="email">Email</h2><p><strong>Resend + React Email</strong></p><p><a href="https://resend.com/?ref=jeremyg.dev">Resend</a> handles transactional email &#x2014; purchase confirmations, moderation notifications, and other emails. The standout feature is that email templates are written as React components using <a href="https://react.email/?ref=jeremyg.dev">React Email</a>, which means they live in the same codebase and use the same component patterns as the rest of the app.</p><p>If you&apos;ve ever tried to maintain HTML email templates, you know how painful it is. React Email makes it dramatically better.</p><p><strong>Alternatives considered</strong>: SendGrid, Postmark, AWS SES. Resend&apos;s developer experience and the React Email integration put it ahead for a project where I wanted to move fast. I&apos;ve used most of the others, and Resend has been solid.</p><h2 id="canvas-rendering">Canvas Rendering</h2><p><strong>PixiJS 8</strong></p><p>The heart of the user experience is a 1000&#xD7;1000 pixel canvas that renders all purchased blocks. That&apos;s potentially a million pixels of dynamically loaded, zoomable, pannable content. The DOM can&apos;t handle that &#x2014; you need a WebGL renderer.</p><p><a href="https://pixijs.com/?ref=jeremyg.dev">PixiJS</a> is the most mature 2D WebGL rendering library. Version 8 brought a new architecture with better performance and a smaller bundle size. It handles the rendering loop, viewport management, and texture loading, while React manages the UI around the canvas. This was mostly decided by the Agents.</p><p><strong>Alternatives considered</strong>: HTML Canvas 2D API (too slow at this scale), Three.js (overkill for 2D), Konva (not as performant for this use case).</p><h2 id="bot-protection">Bot Protection</h2><p><strong>BotId + Cloudflare Turnstile</strong></p><p>Two layers of bot protection that complement each other:</p><p><a href="https://www.cloudflare.com/products/turnstile/?ref=jeremyg.dev">Cloudflare Turnstile</a> is a CAPTCHA alternative that runs as a non-interactive challenge &#x2014; users don&apos;t have to click anything or solve puzzles. It&apos;s verified server-side before any purchase is processed.</p><p><a href="https://www.npmjs.com/package/botid?ref=jeremyg.dev">BotId</a> provides client-side bot detection with browser fingerprinting. It catches automated browsers and headless clients that might bypass Turnstile.</p><p>Together they make it significantly harder for bots to abuse the purchase and generation flow without degrading the experience for real users. Have I mentioned lessons learned running LQ?</p><p><strong>Alternatives considered</strong>: reCAPTCHA (worse UX), hCaptcha, building custom fingerprinting (too much effort for diminishing returns).</p><h2 id="authentication">Authentication</h2><p><strong>GitHub OAuth via Supabase Auth</strong></p><p>Authentication is only required for one flow: applying for AI credits. The site uses GitHub OAuth through Supabase Auth, which means users sign in with their GitHub account, and Supabase handles the token management, session refresh, and PKCE flow.</p><p>GitHub was chosen as the sole OAuth provider because the credit application is aimed at developers. It also allows deduplication &#x2014; each GitHub account can only submit one application, and it&apos;s a reasonable check the submitted is human (for now?).</p><p><strong>Alternatives considered</strong>: Google OAuth, email magic links, Clerk, Auth0. GitHub OAuth is the simplest option that serves the actual user base and had orthogonal benefits.</p><h2 id="observability">Observability</h2><p><strong>Datadog (APM, RUM, Logs, LLMObs) + OpenTelemetry</strong></p><p>Observability is one of those things that&apos;s easy to skip in a side project and then regret when something breaks at 2 AM. This project is instrumented more thoroughly than most production apps. I work at Datadog and in a previous role had a terrible on-call life. You can see how I made a lot of these decisions.</p><ul><li><strong>APM</strong> &#x2014; Distributed tracing across all API routes and external service calls, powered by <code>dd-trace</code> and OpenTelemetry.</li><li><strong>RUM</strong> &#x2014; Real User Monitoring captures frontend performance, errors, and user sessions in the browser.</li><li><strong>Logs</strong> &#x2014; Structured logging with automatic PII redaction, shipped to Datadog for correlation with traces.</li><li><strong>LLMObs</strong> &#x2014; Datadog&apos;s LLM Observability tracks every AI call (moderation, generation, embeddings) with input/output, latency, and cost.</li><li><strong>Monitors and SLOs</strong> &#x2014; Defined as code and synced to Datadog via scripts, so alerting configuration lives in the repo alongside the application code.</li><li><strong>Feature Flags</strong> - Feature flags control which AI model is used for generation and are used for A/B testing UI variants.</li></ul><p>OpenTelemetry provides the instrumentation standard, and <code>dd-trace</code> handles the Datadog-specific export. The Next.js instrumentation hook initializes both in a separate webpack bundle from the application code, which is a pattern worth understanding if you&apos;re doing Obervability on Vercel in Next.js &#x2014; module-level singletons aren&apos;t shared across bundles... and this took me longer than I&apos;d like to admit to debug.</p><p><strong>Alternatives considered</strong>: :|</p><h2 id="cicd">CI/CD</h2><p><strong>GitHub Actions</strong></p><p>The CI pipeline runs on every push and PR, with parallel jobs for linting, type checking, unit tests, integration tests, the production build, and end-to-end tests (Playwright across Chromium and Firefox). Coverage reports and build size reports are posted as PR comments automatically.</p><p>There are separate workflows for production releases (with automated rollback on failure), security scanning (npm audit, CodeQL SAST, secrets detection), and dependency updates via Dependabot.</p><p>The key philosophy: CI should catch everything that matters, and the pipeline should be fast enough that you never skip it. Parallel job execution keeps the total wall time reasonable.</p><p><strong>Alternatives considered</strong>: CircleCI, Jenkins... just kidding. Actions may not be super reliable, but they&apos;re an easy choice for a project like this.</p><h2 id="blog">Blog</h2><p><strong>MDX via next-mdx-remote</strong></p><p>You&apos;re reading this on it. Blog posts are MDX files &#x2014; Markdown with JSX support &#x2014; processed by <a href="https://github.com/hashicorp/next-mdx-remote?ref=jeremyg.dev">next-mdx-remote</a> and rendered as Server Components. Frontmatter is validated with Zod, syntax highlighting uses <a href="https://shiki.style/?ref=jeremyg.dev">Shiki</a> via rehype-pretty-code, and posts support custom components like callouts and captioned images.</p><p>Posts are statically generated at build time, include Schema.org structured data for SEO, and have an auto-generated RSS feed. It&apos;s a simple setup, but it&apos;s everything you need for a technical blog without reaching for a CMS. There&apos;s even an Obsidian plugin to automate the post scaffolding.</p><p><strong>Alternatives considered</strong>: None really, I use Markdown and MDX for a lot and didn&apos;t see a reason to get fancy here.</p><h2 id="wrapping-up">Wrapping Up</h2><p>That&apos;s the full stack. It&apos;s a lot of pieces, but each one was chosen deliberately and (mostly) for the right reasons. Some of these choices will change over time as the project evolves or as better tools emerge.</p><p>If you read the <a href="https://www.jeremyg.dev/why-i-built-a-million-pixels/" rel="noreferrer">first post</a>, you know this project is about building in public. That extends to the technical decisions too. You can see where I have operational scars. Not everything here is perfect, and I expect to revisit some of these choices. When I do, I&apos;ll write about it.</p><p>If you have questions about any of these technologies or how they fit together, use the <a href="https://www.amillionpixels.ai/contact?ref=jeremyg.dev">contact form</a> to reach out. And if you haven&apos;t already &#x2014; go <a href="https://www.amillionpixels.ai/?ref=jeremyg.dev">claim a block</a> and add your prompt to the canvas.</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Why I Built A Million Pixels]]></title><description><![CDATA[<p>I recently launched <a href="https://www.amillionpixels.ai/?ref=jeremyg.dev" rel="noopener noreferrer">A Million Pixels</a>.</p><p>I posted this on the A Million Pixels site, but including here for broader reach.</p><hr><p><a href="https://www.amillionpixels.ai/?ref=jeremyg.dev" rel="noopener noreferrer">A Million Pixels</a>&#xA0;just launched.</p><p>It contains a 1000&#xD7;1000 pixel canvas, where you can select a block, generate an image with AI, and collaboratively build the</p>]]></description><link>https://www.jeremyg.dev/why-i-built-a-million-pixels/</link><guid isPermaLink="false">699e0cfb9081dc0001b70228</guid><category><![CDATA[AI]]></category><category><![CDATA[A Million Pixels]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Tue, 24 Feb 2026 20:44:10 GMT</pubDate><media:content url="https://www.jeremyg.dev/content/images/2026/02/AMP-logo.webp" medium="image"/><content:encoded><![CDATA[<img src="https://www.jeremyg.dev/content/images/2026/02/AMP-logo.webp" alt="Why I Built A Million Pixels"><p>I recently launched <a href="https://www.amillionpixels.ai/?ref=jeremyg.dev" rel="noopener noreferrer">A Million Pixels</a>.</p><p>I posted this on the A Million Pixels site, but including here for broader reach.</p><hr><p><a href="https://www.amillionpixels.ai/?ref=jeremyg.dev" rel="noopener noreferrer">A Million Pixels</a>&#xA0;just launched.</p><p>It contains a 1000&#xD7;1000 pixel canvas, where you can select a block, generate an image with AI, and collaboratively build the canvas. That part is obvious from the homepage.</p><p>You might reasonably ask:&#xA0;<em>why did I build this?</em></p><h2 id="we%E2%80%99ve-crossed-an-inflection-point"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#weve-crossed-an-inflection-point">We&#x2019;ve Crossed an Inflection Point</a></h2><p>I&apos;m a very curious person. As generative AI and LLMs have progressed, I&apos;ve been increasingly adopting them. Recently, I have been using coding agents&#xA0;<strong>a lot</strong>. After using Opus 4.5 and codex 5.3, like many, I am convinced we&apos;ve reached an inflection point.</p><p>The current generation of tools are not just powerful. They enable workflows and outcomes that were not previously possible. You can now build in hours or days what would have taken weeks or months. You can iterate at a fundamentally different pace. You can explore architectural alternatives conversationally.</p><p>It&#x2019;s&#xA0;<em>genuinely awe-inspiring</em>.</p><p>And if you build software for a living, it&#x2019;s at least a&#xA0;<em>little unsettling</em>.</p><h2 id="context"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#context">Context</a></h2><p>For those that don&apos;t&#xA0;<a href="https://www.linkedin.com/in/jeremylq/?ref=jeremyg.dev" rel="noopener noreferrer">know me</a>, I&apos;ve spent the better part of the last two decades helping technical people learn from each other and using a growth mindset to help companies earn durable trust with engineers. At least that&apos;s what my LinkedIn profile says.</p><p>What does that actually mean? I founded LinuxQuestions, I&apos;m on the board of the CNCF and OpenSSF, and I&apos;m the VP of technical community and open source at Datadog. At Datadog, I lead an org of about a dozen teams that operate at the intersection of engineering skills and communication skills. Some, like Technical Content, work mostly in natural language. Some, like the team that maintains Vector, work mostly in code. Some, like Customer Education and Advocacy, are in the middle. Those experiences mean I&apos;ve seen the impact of AI across a wide variety of skills, vocations, and organizations.</p><p>And I have&#xA0;<strong>opinions</strong>.</p><h2 id="what-this-is-and-isnt"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#what-this-is-and-isnt">What this is... and isn&apos;t</a></h2><p>I don&apos;t think the reality has set in for many people yet.</p><p>On one side, you have claims that SaaS is dead and software engineering is going away.</p><p><em>It isn&#x2019;t.</em></p><p>On the flips side are the thoughts (feelings?) that AI is a fad and is going to disappear or fade away.</p><p><em>It won&apos;t.</em></p><p>While you may not be able to blindly trust AI output (yet?), we&apos;re&#xA0;<strong>way</strong>&#xA0;past the point where you can just ignore it. Software developers aren&apos;t going away, but there are very real implications for anyone who builds software.</p><p>The Internet changed everything. I believe this will too. I also think there are a lot of similarities between the Internet-era bubble and where we are today, but that&apos;s a topic for a future post.</p><h2 id="the-next-abstraction-layer"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#the-next-abstraction-layer">The Next Abstraction Layer</a></h2><p>It&apos;s easy to forget how adaptable software engineers have had to be over the years. In a lot of ways, coding with codex or claude code feels like the next level of abstraction to me. We went from punch cards, to very low level languages, to higher level languages, to this. Each layer allowed us to focus more on outcomes and less on the implementation details of the language.</p><p>But here&#x2019;s the part that gets lost in both the hype and the backlash: abstraction doesn&#x2019;t eliminate fundamentals.&#xA0;<em>It makes them more important.</em></p><p>At least for now, you very much need to understand foundational engineering principles to use agentic coding for anything more than toy apps or cool demos. You cannot build something durable, scalable, or secure without deep engineering judgment.</p><p><em>Agentic coding amplifies skill... it doesn&#x2019;t replace it.</em></p><h2 id="why-i-built-a-million-pixels"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#why-i-built-a-million-pixels">Why I Built A Million Pixels</a></h2><p>So back to the question posed in the first paragraph: Why did I build this site?</p><p>Two reasons, and I&apos;ve already alluded to them both.</p><p>First:&#xA0;<em>curiosity</em></p><p>I wanted to see what I could build. In the end, I learned a ton and the site was really fun to build. I&apos;ll cover a bunch of the details in future posts.</p><p>Second:&#xA0;<em>conviction</em></p><p>I am convinced that the next generation of developers will need to be AI-native to be successful. As an industry, we are woefully underprepared for that future.</p><p>I don&apos;t think we really know&#xA0;<em>exactly</em>&#xA0;what&#xA0;<em>AI-native</em>&#xA0;means yet, but it&apos;s more than just the prompt. Knowing how to collaborate with systems like this. Decomposing problems well. Validating outputs critically. Leveraging agents responsibly. Who knows what else.</p><p>Access to that kind of experimentation shouldn&#x2019;t be gated.</p><p>That&apos;s why 100% of the net proceeds (ie. after fees, usage charges, and taxes) will go to donations to coding education and providing AI credits. I am committed to not profiting a single dollar as a result of this site.</p><p>If this shift is as important as I believe it is, we need to lower barriers... not just talk about the future.</p><h2 id="build-with-me"><a href="https://www.amillionpixels.ai/blog/why-i-built-a-million-pixels?ref=jeremyg.dev#build-with-me">Build with me</a></h2><p>So as the homepage says: claim a block, write a prompt, and watch AI (and humans!) create a unique canvas.</p><p>The&#xA0;<a href="https://www.amillionpixels.ai/about?ref=jeremyg.dev" rel="noopener noreferrer">About</a>&#xA0;and&#xA0;<a href="https://www.amillionpixels.ai/faq?ref=jeremyg.dev" rel="noopener noreferrer">FAQ</a>&#xA0;pages likely answer many of the questions you have, but I&apos;m curious to know what you think of the project. Use the&#xA0;<a href="https://www.amillionpixels.ai/contact?ref=jeremyg.dev" rel="noopener noreferrer">contact form</a>&#xA0;to let me know.</p><p>We&#x2019;re all learning how to build in this new era. Let&#x2019;s experiment in public.</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Welcome to JeremyG.dev]]></title><description><![CDATA[<p>I used to write quite a bit. Much of that writing (1,153 posts) happened at jeremy.linuxquestions.org. The last post there was a Pixel 5 (!) review in 2020. The  post before that was in 2017. I&apos;ve been busy. But recently, I realized how much I miss</p>]]></description><link>https://www.jeremyg.dev/welcome-to-jeremyg-dev/</link><guid isPermaLink="false">699e04cd9081dc0001b70206</guid><category><![CDATA[announcement]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Tue, 24 Feb 2026 20:18:53 GMT</pubDate><content:encoded><![CDATA[<p>I used to write quite a bit. Much of that writing (1,153 posts) happened at jeremy.linuxquestions.org. The last post there was a Pixel 5 (!) review in 2020. The  post before that was in 2017. I&apos;ve been busy. But recently, I realized how much I miss writing.  For me, writing really helps me clarify my thoughts. It&apos;s often also the process by which I realize that I do not understand a topic as well as I thought I did. It&apos;s a great forcing function to learn and really process.</p><p>With that, I&apos;m launching JeremyG.dev. I&apos;ve migrated all old posts for posterity, and I <em>hop</em>e to post more than once every 6 years. The industry is moving faster than it has in a long time, and there has never been a better time to share and learn together.</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Landing]]></title><description><![CDATA[<h2 id="about">About</h2><p>I&apos;ve spent two decades helping technical people learn from each other and using a growth mindset to help companies earn durable trust with engineers.<br><br>I specialize in scaling technical, credibility-driven organizations that operate as both brand builders and business accelerants.<br><br>Currently: VP, Technical Community and Open Source</p>]]></description><link>https://www.jeremyg.dev/landing/</link><guid isPermaLink="false">699cc3768b49560001ad56eb</guid><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Mon, 23 Feb 2026 21:16:30 GMT</pubDate><content:encoded><![CDATA[<h2 id="about">About</h2><p>I&apos;ve spent two decades helping technical people learn from each other and using a growth mindset to help companies earn durable trust with engineers.<br><br>I specialize in scaling technical, credibility-driven organizations that operate as both brand builders and business accelerants.<br><br>Currently: VP, Technical Community and Open Source @Datadog | CNCF and OpenSSF Governing Board Member | Founder, LinuxQuestions.org | <a href="https://www.linkedin.com/in/jeremylq/?ref=jeremyg.dev" rel="noreferrer">More</a></p><h2 id="writing">Writing</h2><p>I just started writing again. Stay tuned.</p><h2 id="projects">Projects</h2><ul><li><a href="https://www.linuxquestions.org/questions/?ref=jeremyg.dev" rel="noreferrer">LinuxQuestions.org</a></li><li><a href="https://www.amillionpixels.ai/?ref=jeremyg.dev" rel="noreferrer">A Million Pixels</a></li><li><a href="https://weather.jeremyg.dev/?ref=jeremyg.dev" rel="noreferrer">Pirate Weather Extension</a></li><li><a href="https://wyndo.app/?ref=jeremyg.dev" rel="noreferrer">Wyndo</a> - Find the best weather window</li></ul>]]></content:encoded></item><item><title><![CDATA[Pixel 5 Review]]></title><description><![CDATA[<p>Wow. It&apos;s been longer than I realized since I&apos;ve posted. I recently reviewed the Pixel 5 for an episode of <a href="https://www.badvoltage.org/2020/11/27/3x17/?ref=jeremyg.dev" rel="noreferrer noopener">Bad Voltage</a>, and thought others may be interested in the review. Unrelated, I&apos;d make more of an effort to post my thoughts here more</p>]]></description><link>https://www.jeremyg.dev/pixel-5-review/</link><guid isPermaLink="false">699ca52f8b49560001ad3042</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Reviews]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Fri, 27 Nov 2020 18:57:08 GMT</pubDate><content:encoded><![CDATA[<p>Wow. It&apos;s been longer than I realized since I&apos;ve posted. I recently reviewed the Pixel 5 for an episode of <a href="https://www.badvoltage.org/2020/11/27/3x17/?ref=jeremyg.dev" rel="noreferrer noopener">Bad Voltage</a>, and thought others may be interested in the review. Unrelated, I&apos;d make more of an effort to post my thoughts here more often. In the meantime, here&apos;s the review:</p><p>Regular listeners will know that I&apos;m a big fan of the Pixel line of phones (and was a Nexus fan before that). The unadulterated bloatware-free Android experience really is top notch. That said, for the first time since the Pixel 1, I decided to skip the Pixel 4 for a variety of reasons. There were just too many things about it I didn&apos;t like. The Pixel 5 got me back on board though, and I&apos;ve had it for a few weeks now. So, what do I think?</p><p>On paper, the Pixel 5 seems a bit; if not disappointing then underwhelming. It sports a 6-inch OLED display with 90Hz refresh rate and a bezel-less design. It has wireless charging, fingerprint unlock, and is IP68 dust and waterproof. The phone ships with 8G of memory and 128G of storage. All good so far, you may be thinking. But eschewing a flagship SoC for the Snapdragon 765G resulted in Google taking quite a bit of flak. So did including the same main camera as the previous generation Pixel, and shipping with two front facing cameras instead of three. What&apos;s clear to me is that, at $699 Google decided to stop playing the one thousand dollar and up flagship game. They got back to basics; and it&apos;s surprisingly good.</p><p>While the display is 6 inches vs the 5.5 inches of my previous Pixel 3, the phone is almost identical in size due to the lack of abezel. What isn&apos;t even close to identical in size though is the battery - 2915 mAh vs 4080 mAh. The difference is night and day; and by that I mean come nighttime you&apos;ll actually still have a charge. The phone is aluminum but with a resin coating that I quite like. It&apos;s grippier than glass and isn&apos;t as much of a fingerprint magnet as many newer phones. Gone is the facial unlock and Soli that never quite panned out. As for the supposed slow SoC, for me it&apos;s been more than sufficient. If you&apos;re a very serious gamer or obsessed with benchmarks, you may notice a difference. I&apos;m a pretty heavy users of my phone though, and I don&apos;t.</p><p>So - what&apos;s the bottom line? There&apos;s nothing groundbreaking or mesmerizing about Pixel 5&apos;s design... or about the Pixel 5 in general. At $699, this should be a phone of trade-offs and compromises. Ars ran a review titled &quot;Google spends its bill-of-materials budget unwisely&quot;. But I think they missed the mark. Google managed to add 2GB ram, double the default storage to 128gb, increase battery by 50% and still make the phone $200 cheaper. It&apos;s a near perfect BoM if it wasn&apos;t for mmWave. I&apos;m guessing they made some kind of deal with Verizon, but adding $50-100 to the phone makes very little sense for something almost no one will use.</p><p>Despite the mid-tier chipset, running an unfettered version of Android means the chip isn&apos;t bogged down and lets the Pixel 5 deliver an Android experience that feels just as fast as it does on phones with much faster chips. The massive battery life is a game changer, and the device just feels right in your hands. While I&apos;ve always had a quote unquote flagship phone and this one really isn&apos;t&#x2026; It feels like one. A bit to my surprise, it&apos;s a great phone. The Pixel is back.</p>]]></content:encoded></item><item><title><![CDATA[Jarvis Bamboo Standing Desk Review]]></title><description><![CDATA[<p>In the most recent episode of <a href="http://community.badvoltage.org/t/2x16-indeskribable/11275?ref=jeremyg.dev" rel="noopener">Bad Voltage</a>, I reviewed the Jarvis Bamboo Adjustable Height Standing Desk . Tune in to listen to the ensuing discussion and the rest of the show.</p><figure class="kg-card kg-image-card"><img src="https://www.jeremyg.dev/content/images/2026/02/newjarvis-bamboo-contour-silver.jpg" class="kg-image" alt loading="lazy" width="630" height="630" srcset="https://www.jeremyg.dev/content/images/size/w600/2026/02/newjarvis-bamboo-contour-silver.jpg 600w, https://www.jeremyg.dev/content/images/2026/02/newjarvis-bamboo-contour-silver.jpg 630w"></figure><p>Between LinuxQuestions, Datadog, consulting, Bad Voltage, Opensource.com, Linux Fund, and the other online activities I partake in, I&</p>]]></description><link>https://www.jeremyg.dev/jarvis-bamboo-standing-desk-review/</link><guid isPermaLink="false">699ca52f8b49560001ad3041</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Reviews]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Mon, 28 Aug 2017 14:13:34 GMT</pubDate><content:encoded><![CDATA[<p>In the most recent episode of <a href="http://community.badvoltage.org/t/2x16-indeskribable/11275?ref=jeremyg.dev" rel="noopener">Bad Voltage</a>, I reviewed the Jarvis Bamboo Adjustable Height Standing Desk . Tune in to listen to the ensuing discussion and the rest of the show.</p><figure class="kg-card kg-image-card"><img src="https://www.jeremyg.dev/content/images/2026/02/newjarvis-bamboo-contour-silver.jpg" class="kg-image" alt loading="lazy" width="630" height="630" srcset="https://www.jeremyg.dev/content/images/size/w600/2026/02/newjarvis-bamboo-contour-silver.jpg 600w, https://www.jeremyg.dev/content/images/2026/02/newjarvis-bamboo-contour-silver.jpg 630w"></figure><p>Between LinuxQuestions, Datadog, consulting, Bad Voltage, Opensource.com, Linux Fund, and the other online activities I partake in, I&apos;m in my office <em>a lot</em>. And while I try to be active when I&apos;m not in my office, there&apos;s substantial research coming out that indicates long period of sitting are bad for your body irrespective of how much exercise you otherwise get. Enter a standing desk.</p><p>Before moving on to the review, I should note: While most studies agree that sitting for long periods of time is bad for you, there is still ongoing research on whether standing undoes that damage. That&apos;s not to say a standing desk isn&apos;t beneficial, but keep in mind there is not enough evidence yet from quality studies to prove exactly how beneficial.</p><p>On to the desk. While a variety of adjustable standing desks are available, after considerable research I ended selecting the Jarvis Bamboo from Fully. The desk comes in seven sizes with either rectangle and contour tops. I went with the 60&quot;x30&quot; contour combination. From there you you choose from an assortment of accessories including programmable memory adjustment, wire management , and CPU holders. Once you make your selection, the desk is sent out the next day via ground shipping and will arrive in two boxes.</p><p>The first box I opened had nothing but the desktop. You immediately notice how high quality the harvested bamboo is. It&apos;s sturdy but not too heavy and has a look I really like. The other box had the frame and all other components. Assembly was straight forward and took roughly thirty minutes, including attaching the optional CPU holder and my existing monitor arms. The wire management option is nice, but not custom built for the desk. I went with the programmable memory and as a $35 upgrade I&apos;d consider it a must if you&apos;re going go with an adjustable height desk. It has 4 programmable options, which make the perfect height for standing or sitting a single click every time.</p><p>Once assembled I quickly put the desk to use. It&apos;s reasonably quiet considering it supports lifting 350 pounds and it extremely stable at all heights I tested. I&apos;ve found myself standing roughly 20-25% of the time and it&apos;s been an improvement for not only my health, but for my workflow. At around $600 as I spec&apos;d it out, it&apos;s not cheap, but when you couple how often I&apos;m at my desk with the fact that this desk should easily last over a decade it seems like a small price to pay.</p><p>So, what&apos;s the Bad Voltage verdict? If you&apos;re looking for an adjustable height standing desk, I highly recommend the Jarvis Bamboo. I&apos;ve been using it for over a month now and I would not want to go back to a traditional desk. If you&#x2019;re committed to a standing routine, but you already own a standard-height desk you like, or the price of a fully adjustable desk is just too much, options such as the Ergo Desktop Kangaroo Pro Junior or Varidesk may be worth a look. Either way, I can also recommend the Topo mini mat, which I&apos;ve found extremely comfortable.</p><p>You may have noticed this review is a bit lighter on details than most of mine are. This was very much by design. There are a ton of high quality in-depth reviews available for the Jarvis, and other variable height options, so there isn&apos;t a lot I can add. What I&apos;d like to know is, what the rest of the Bad Voltage team thinks about the concept and work-flow of a standing desk, their opinion on buying a new fully adjustable desk vs using something like a Varidesk, and whether making either purchase is something they&apos;d consider.</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Another Bad Voltage Live is in the books]]></title><description><![CDATA[<p>Earlier this month we recorded our fourth live show. I&apos;d like to think it&apos;s our best so far. We covered interesting topics, had some laughs, and although we still have a ton of areas we need to improve; we&apos;re really starting to hit our</p>]]></description><link>https://www.jeremyg.dev/another-bad-voltage-live-is-in-the-books/</link><guid isPermaLink="false">699ca52f8b49560001ad3040</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Cloudflare]]></category><category><![CDATA[Dell]]></category><category><![CDATA[Endless]]></category><category><![CDATA[Linode]]></category><category><![CDATA[scale]]></category><category><![CDATA[System76]]></category><category><![CDATA[Ticketmaster]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Thu, 23 Mar 2017 15:56:16 GMT</pubDate><content:encoded><![CDATA[<p>Earlier this month we recorded our fourth live show. I&apos;d like to think it&apos;s our best so far. We covered interesting topics, had some laughs, and although we still have a ton of areas we need to improve; we&apos;re really starting to hit our stride. The show kicked off a discussion internally, and while I can&apos;t offer any additional information now, let&apos;s just say that if we can execute on our plans you should definitely stay tuned. If you have any <a href="http://www.badvoltage.org/2017/03/20/2x05/?ref=jeremyg.dev">comments or suggestions</a> on how you think we can improve the show, we&apos;re certainly interested in what you think. Back to the live show, I&apos;d like extend a huge thanks to: Ticketmaster for providing the venue and entertainment/refreshments, Linode for getting us there, Dell and Endless for the prizes, and SCALE for once again allowing us to be the prime entertainment for Friday night. Also a huge round of applause for Chris on an ebullient intro, and Rikki and Hannah for agreeing to be in the game show... which in my opinion came out fantastic. Full disclosure on that - I was the quiz master. If you haven&apos;t watched the live show yet, you still have a chance to <a href="http://www.badvoltage.org/fruit/?ref=jeremyg.dev">win a Ubuntu Dell Sputnik laptop</a>.</p><figure class="kg-card kg-embed-card"><iframe loading="lazy" title width="160" height="9" src="https://www.youtube.com/embed/jieQHBeKJJs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>
<blockquote>The Bad Voltage live stage show, from SCaLE 15x in Pasadena, March 2017!
<p>An epic time was had. Jeremy Garcia, Jono Bacon, and Stuart Langridge, live on stage, in which there was some downright unfair quizzing of Jono, a one-sh*t trumpet, the brightest suit that&#x2019;s ever been seen, a machine to count eggs, Perl abuse, a hollow burrito, pies, more pies, hammer pants, the Phantom Zone, no air horns, the products of the Chevy company, and a reappearance of Bryan! As well as:</p>
<ul>
 	<li>[00:07:00] The news! Featuring the <a href="https://www.theregister.co.uk/2017/03/01/aws_s3_outage/?ref=jeremyg.dev">Amazon S3 outage</a>, <a href="http://www.recode.net/2017/3/2/14790468/snap-ipo-opens-trading-24-33-billion?ref=jeremyg.dev">Snapchat being worth $33 billion</a>, <a href="https://twitter.com/wavis/status/837372505190875137?ref=jeremyg.dev">System76 bringing manufacturing in-house</a>, and how swimming pools have <a href="https://www.acs.org/content/acs/en/pressroom/presspacs/2017/acs-presspac-march-1-2017/how-to-monitor-urine-in-pools-by-testing-sweetness.html?ref=jeremyg.dev">dustbins full of urine in</a></li>
 	<li>[00:11:30] Cloudflare had a <a href="https://techcrunch.com/2017/02/23/major-cloudflare-bug-leaked-sensitive-data-from-customers-websites/?ref=jeremyg.dev">pretty serious security flaw</a> identified by the Project Zero team at Google, where sensitive data from all sorts of Cloudflare sites was leaked &#x2014; passwords, auth tokens, and the like. What&#x2019;s the deal with this sort of issue? It&#x2019;s surprising how much of the internet turned out to be behind Cloudflare, and this sort of centralisation is a problem&#x2026; but equally, there&#x2019;s a reason we go to experts in the field and outsource services to them! So, what&#x2019;s the best approach here?</li>
 	<li>[00:20:00] Quizmaster extraordinaire Jeremy plays Much Taboo About Nothing, in which team opensource Jono and Rikki team up to battle heroic ginger team Stuart and Hannah in a game of wit, erudition, vocabulary, guesswork, and trying to not be too nasty about Ruby people. Partially successfully, depending on your attitude on rule-bending and wide appreciation of cultures&#x2026;</li>
 	<li>[00:33:20] Why are all our amazing technological advances being used to make stupid pointless gadgets that nobody should buy? Paper towel dispensers that magically detect your hand movement and then <em>still dispense a bit of brown paper</em> to dry your hands on; amazing iPad-based payment systems which still require you to sign your name with your finger; endless pointless stupid Internet of Things devices. Stuart rants, and Jono and Jeremy respond with various degrees of defence or agreement as to where we&#x2019;re going and what to do about incredible technology put to wasteful ends</li>
 	<li>[00:43:00] Ig-NOT &#x2014; it&#x2019;s like the Ignite talk series, but&#x2026; not. The presenters each do a talk, on an unknown subject chosen by the audience, using unseen images suggested by the community and the other presenters. And&#x2026; well, see how they get on. Featuring some properly unkind choices, a brief and magnanimous appearance by Bryan, and a very weird old guy with an axe&#x2026;</li>
</ul>
</blockquote>
<img class="aligncenter size-full wp-image-1469" src="https://www.jeremyg.dev/content/images/2026/02/img_9579.jpg" alt width="630" height="420">
<p>--jeremy</p>
</iframe></figure>]]></content:encoded></item><item><title><![CDATA[PicoBrew Pico Review]]></title><description><![CDATA[<p>In the most recent episode of <a href="http://www.badvoltage.org/2017/02/09/2x03/?ref=jeremyg.dev">Bad Voltage</a>, I reviewed the PicoBrew Pico. Tune in to listen to the ensuing discussion and the rest of the show.</p><figure class="kg-card kg-image-card"><img src="https://www.jeremyg.dev/content/images/2026/02/71qtao16lal-_sx355_.jpg" class="kg-image" alt="71qtao16lal-_sx355_" loading="lazy" width="355" height="237"></figure><p>Brewing beer is a complex and subtle mix of art and science. As a fan of both craft beer and technology, when I</p>]]></description><link>https://www.jeremyg.dev/picobrew-pico-review/</link><guid isPermaLink="false">699ca52f8b49560001ad303f</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Reviews]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Tue, 14 Feb 2017 14:14:26 GMT</pubDate><content:encoded><![CDATA[<p>In the most recent episode of <a href="http://www.badvoltage.org/2017/02/09/2x03/?ref=jeremyg.dev">Bad Voltage</a>, I reviewed the PicoBrew Pico. Tune in to listen to the ensuing discussion and the rest of the show.</p><figure class="kg-card kg-image-card"><img src="https://www.jeremyg.dev/content/images/2026/02/71qtao16lal-_sx355_.jpg" class="kg-image" alt="71qtao16lal-_sx355_" loading="lazy" width="355" height="237"></figure><p>Brewing beer is a complex and subtle mix of art and science. As a fan of both craft beer and technology, when I stumbled upon the Pico by PicoBrew I was intrigued. For those not familiar with the Pico, it&apos;s a device that semi-automatically brews 5 liters of fresh craft beer at home in about 2 hours using grain and hop PicoPaks from dozens of breweries worldwide. From well known beers such as Dead Guy Ale from Rogue and Brew Free or Die from 21st Amendment, to niche beers from small local breweries scattered around the world that are unlikely to be available outside their direct locale, the selection is good and still growing rapidly. You&apos;re also able to create your own beer from scratch via the Freestyle option that lets you choose a base style and then customize with around a dozen grain options, a half dozen hop varieties and the optional ability to dry hop.</p><p>The Pico guides you through the first few brewing steps over the course of roughly two hours, however like with any home brew, you need to wait between a few days and up to a couple of weeks for your beer to ferment and carbonate. I&apos;ve heard it described as the Keurig of beer, but I don&apos;t think that&apos;s an apt characterization. Making beer with the Pico is somewhere between traditional home brewing and and a K-Cup type experience, which InBev claims to be working on incidentally. With that in mind, on to the actual device.</p><p>The Pico is a fairly large device, measuring 16&quot; x 12&quot; x 14&quot; and weighing in at 24 pounds. That may make it a difficult to accommodate for some. As the initial shipment comes with a PicoPak, a brewing keg, a dispensing keg, and quite a few accessories the delivery box is massive. Once you unpack everything initial setup is a breeze. Simply plug in the device, connect it to your wifi, and then associate it with your Pico account. The only thing left is the initial rinse, which is automated, and cleaning/sanitizing all the accessories and kegs. As with traditional home brewing, you better get used to cleaning and sanitizing as there is a lot of it involved. If you were expecting to hit a button, get beer, and be done let me allay you of that idea right now.</p><p>With everything gleaming and sanitary you&apos;re ready for your first brew. The first part of the brewing process involves inserting the PicoPak into the main step filter. Each PicoPak is automatically recognized by the device and comes with a Hops Pak and a Grain Pak. From there you connect the brewing keg, which uses standard ball lock connectors, add some distilled water and start the process. For most recipes you can adjust the ABV (alcohol content) and IBU (bitterness), but nothing else. While the on-screen directions are usually clear, I recommend keeping the manual handy for the first couple batches. Roughly two very noisy hours later you have the smell of fresh bread in the air and brewed wort in your keg. You can track the progress of your brew, in real-time, online. Follow the cleaning and sanitizing instructions on the device and let the wort cool to the correct brewing temperature, which is noted on the Pak. From there you pitch your yeast, watch the airlock bubble for between a few days and a couple weeks, then rack the beer into either the serving keg or your kegerator system. While they offer a method to &quot;fast ferment&quot; your wort, I recommend sticking with the standard fermentation process. You can carbonate the beer with the priming sugar that comes with the PicoPak or force carbonate using the included adapter. You now have fresh homemade beer.</p><figure class="kg-card kg-image-card"><a href="https://www.jeremyg.dev/content/images/2026/02/buffalosweat.png"><img src="https://www.jeremyg.dev/content/images/2026/02/buffalosweat-w-630.png" class="kg-image" alt="buffalosweat" loading="lazy" width="630" height="376" srcset="https://www.jeremyg.dev/content/images/size/w600/2026/02/buffalosweat-w-630.png 600w, https://www.jeremyg.dev/content/images/2026/02/buffalosweat-w-630.png 630w"></a></figure><p>How is that beer? I&apos;ve brewed a few different styles from multiple breweries and the results have been mixed. My initial brew was a Buffalo Sweat Stout and it came out really good. In fact, some people that tried it didn&apos;t believe I brewed it at home. On the other end of the spectrum, the Dead Guy Ale tasted off to the point of being almost undrinkable. As I brew more recipes from additional breweries I am curious to see which experience becomes the norm. Unfortunately I haven&apos;t had a chance to try the Freestyle option yet, but I plan to very soon and will update with results when I do.</p><p>Note that new Pico devices also ship with a sous vide adapter. My Pico did not, but the company has stated they plan to ship the adapter to everyone eventually. Looking at the instructions, however, it&apos;s much more complicated than a traditional sous vide. It&apos;s pretty clear the company was committed to including the functionality because it was promised in their kickstarter, and they should be commended for this. It may be a decent way to test whether you like cooking sous vide, but if you&apos;re serious about it I suspect you&apos;ll want a proper setup sooner than later. I still use the <a href="https://www.jeremyg.dev/anova-precision-cooker-review/">Anova</a> I reviewed in an previous episode and recommend it.</p><p>So, what&apos;s the Bad Voltage verdict? At $799 the device is a fair bit more expensive than a traditional home brew setup. While it automates much of the process, there is still quite a bit of manual cleaning, sanitizing, and other work that must be done and the &quot;beer in two hour&quot; pitch is a little disingenuous. PicoPaks run between $19-$29, which translates to around $10-15 per growler of beer. It will be interesting to see how many breweries come on board and how consistent the end result is. So far the company has been very receptive to feedback and seem genuinely interested in listening to customers and improving the product, so I&apos;m encouraged. PicoBrew deserves credit for making the brewing process simpler and removing some variables without making it much less authentic. I suspect if you really enjoy craft beer and live somewhere a good variety of it is difficult to procure, the device could be a compelling purchase. I also suspect many will consider it far too expensive, too complicated, and too inconsistent to justify the cost or effort involved. Note the company also makes a device called the Zymatic which is a true all-grain brewing appliance that is almost akin to a miniaturized commercial brewery. At $2,000 it&apos;s a major investment but it also comes with the ability to sell PicoPaks in the BrewMarkepace, so may be an option for those looking to break into commercial brewing.</p><p>UPDATE: After recording the show I contacted PicoBrew with the following question: &quot;If PicoBrew were to fail as a company, would the device be rendered useless? The fact that you cannot add your own ingredients to a pak would seem to indicate this is the case. Am I missing something? Thanks.&quot;</p><p>They once again responded extremely quickly (under thirty minutes) with the following: &quot;You are not missing anything and that is a quite valid concern. To alleviate this concern, we can promise two things:</p><ol><li>We&apos;re not going anywhere. &#xA0;We have a quite solid business plan and a quite large purse to keep us going for many years to come.</li><li>If we were to go out of business, we would make sure our customers, those who trust and support us, are not screwed in our passing. &#xA0;We would release all software surrounding our products and let the community build themselves a working server to support their appliances as well as release how to build your own Pak.&quot;</li></ol><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Bad Voltage Season 2 Episode 3 Has Been Released: And Those Who Dig]]></title><description><![CDATA[<p>Stuart Langridge, Jono Bacon, and myself present Bad Voltage, with special guest presenter <a href="http://christina.is/?ref=jeremyg.dev">Christina Warren</a>, speaker, tech journalist from <a href="http://www.gizmodo.co.uk/author/christina-warren?ref=jeremyg.dev">Gizmodo</a>, and podcaster at <a href="https://www.relay.fm/rocket?ref=jeremyg.dev">Rocket</a>. In this show:</p><ul><li>[00:03:12] In the news this week: <a href="http://gizmodo.com/tv-maker-vizio-to-pay-out-millions-after-secretly-colle-1792056140?ref=jeremyg.dev">Vizio get fined $2.2m for secretly collecting everything you watch on their TVs and</a></li></ul>]]></description><link>https://www.jeremyg.dev/bad-voltage-season-2-episode-3-has-been-released-and-those-who-dig/</link><guid isPermaLink="false">699ca52f8b49560001ad303e</guid><category><![CDATA[Bad Voltage]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Fri, 10 Feb 2017 10:33:58 GMT</pubDate><content:encoded><![CDATA[<p>Stuart Langridge, Jono Bacon, and myself present Bad Voltage, with special guest presenter <a href="http://christina.is/?ref=jeremyg.dev">Christina Warren</a>, speaker, tech journalist from <a href="http://www.gizmodo.co.uk/author/christina-warren?ref=jeremyg.dev">Gizmodo</a>, and podcaster at <a href="https://www.relay.fm/rocket?ref=jeremyg.dev">Rocket</a>. In this show:</p><ul><li>[00:03:12] In the news this week: <a href="http://gizmodo.com/tv-maker-vizio-to-pay-out-millions-after-secretly-colle-1792056140?ref=jeremyg.dev">Vizio get fined $2.2m for secretly collecting everything you watch on their TVs and lying about it</a>, <a href="http://www.networkworld.com/article/3162740/security/cops-use-pacemaker-data-as-evidence-to-charge-homeowner-with-arson-insurance-fraud.html?ref=jeremyg.dev">police use someone&apos;s pacemaker data to help prove that they committed arson</a>, <a href="http://www.bbc.co.uk/news/technology-38892390?ref=jeremyg.dev">Uber hire a NASA person and start talking about flying taxis</a>, and <a href="https://www.theregister.co.uk/2017/02/07/streetmap_loses_google_maps_appeal/?ref=jeremyg.dev">Streetmap lose their appeal after suing Google for unfairly pushing their own map product</a></li><li>[00:17:00] In honour of our special guest being <a href="https://twitter.com/film_girl?ref=jeremyg.dev">@film_girl</a> on Twitter, we&apos;ve put together a list of &quot;the good, the bad, and the ugly&quot; in film: films that are really great, secretly great, and idiosyncratically terrible</li><li>[00:39:30] Jeremy reviews the <a href="https://www.picobrew.com/?ref=jeremyg.dev">Pico Brew</a>, a device for brewing your own beer easily without having to buy all the glassware and a forty foot mash tun</li><li>[00:56:35] Is there actually a space for a successful &quot;third player&quot; in mobile phones? Microsoft, Ubuntu, Sailfish, Palm, RIM, all have foundered in pursuit of this market. And if there&apos;s no space for it in phones, who will shift the market to some new _type_ of product, and what will that product be?</li></ul><p>Also, Bad Voltage are returning to <a href="https://www.socallinuxexpo.org/scale/15x?ref=jeremyg.dev">SCALE</a> in Pasadena in March for a live show! With free food and an open bar, and the 80s nerd rocker band the Spazmatics, <a href="http://www.badvoltage.org/live/?ref=jeremyg.dev">the show&apos;s gonna be great</a>. Buy your SCaLE tickets now!</p><p><strong>Listen to 2&#xD7;3: <a href="http://www.badvoltage.org/2017/02/09/2x03?ref=jeremyg.dev">And Those Who Dig</a></strong><br><br></p><p>From the Bad Voltage site: Every two weeks Bad Voltage delivers an amusing take on technology, Open Source, politics, music, and anything else we think is interesting, as well as interviews and reviews. Do note that Bad Voltage is in no way related to <a href="http://www.linuxquestions.org/?ref=jeremyg.dev">LinuxQuestions.org</a>, and unlike LQ it will be decidedly NSFW. That said, head over to the Bad Voltage website, take a listen and let us know what you think.</p>]]></content:encoded></item><item><title><![CDATA[Bad Voltage Season 2 Episode 2 Has Been Released: Failed to Capture]]></title><description><![CDATA[<p>With Bryan Lunduke moving on (best of luck with the Lunduke Hour; go take a listen), we decided to start &quot;season 2&quot; of Bad Voltage. <a href="http://www.badvoltage.org/2017/01/11/2x01/?ref=jeremyg.dev">Last episode</a> we covered our 2017 predictions and Jono reviewed an SUV Caddy. We also added a recurring News segment to the show.</p>]]></description><link>https://www.jeremyg.dev/bad-voltage-season-2-episode-2-has-been-released-failed-to-capture/</link><guid isPermaLink="false">699ca52f8b49560001ad303d</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[ChromeOS]]></category><category><![CDATA[GPL]]></category><category><![CDATA[licensing]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Thu, 26 Jan 2017 16:52:04 GMT</pubDate><content:encoded><![CDATA[<p>With Bryan Lunduke moving on (best of luck with the Lunduke Hour; go take a listen), we decided to start &quot;season 2&quot; of Bad Voltage. <a href="http://www.badvoltage.org/2017/01/11/2x01/?ref=jeremyg.dev">Last episode</a> we covered our 2017 predictions and Jono reviewed an SUV Caddy. We also added a recurring News segment to the show. In episode two:</p><p>Stuart Langridge, Jono Bacon, and myself present Bad Voltage, your fortnightly recommended dose of vitamins and minerals. Featuring a <i>still</i> virulently ill Jono, the uttering of the phrase &#x201C;FreeBSD&#x201D; in these hallowed halls, and:</p><ul><li>[00:02:26] In the news this week, the Guardian wrongly declare WhatsApp to have a &#x201C;back door&#x201D; and get <a href="http://gizmodo.com/theres-no-security-backdoor-in-whatsapp-despite-report-1791158247?ref=jeremyg.dev">huge pushback from security experts</a> demanding a retraction, <a href="http://www.theregister.co.uk/2017/01/16/google_reveals_its_servers_all_contain_custom_security_silicon/?ref=jeremyg.dev">Google is big enough to develop a trusted hardware solution for internal use only</a> and isn&#x2019;t going to sell it, possibly heralding a new era of hardware that nobody will be able to buy, and Facebook <a href="http://mashable.com/2017/01/23/facebook-oculus-rooms-vr/?ref=jeremyg.dev">are doing something with VR</a> thus confirming one of Jono&#x2019;s predictions and he almost dies of smugness</li><li>[00:13:00] We review the <a href="https://www.acpad.com/?ref=jeremyg.dev">ACPAD</a>, which calls itself &#x201C;the electronic orchestra for your guitar&#x201D; after its successful Kickstarter; what&#x2019;s it all about?</li><li>[00:27:30] Is ChromeOS &#x201C;desktop Linux&#x201D;? We asked this question in the last show, and it&#x2019;s a bigger one than we might think. If it is, do Chromebook successes count as &#x201C;the year of the Linux desktop&#x201D;? If it isn&#x2019;t, is it a threat? A rival or a friend? Should we buy a Chromebook?</li><li>[00:50:07] People are using the GPL less and permissive licenses more; this isn&#x2019;t just a feeling, <a href="http://redmonk.com/sogrady/2017/01/13/the-state-of-open-source-licensing/?ref=jeremyg.dev">it&#x2019;s confirmed by research</a>. Why is this? Is it a problem? And do we think that anyone should care?</li></ul><p>Also, Bad Voltage are returning to <a href="https://www.socallinuxexpo.org/scale/15x?ref=jeremyg.dev">SCALE</a> in Pasadena in March for a live show! <a href="http://www.badvoltage.org/live/?ref=jeremyg.dev">Keep your ears open for more details</a>, and buy your SCALE tickets now!</p><p><strong>Listen to 2&#xD7;2: <a href="http://www.badvoltage.org/2017/01/26/2x02/?ref=jeremyg.dev">Failed to Capture</a></strong><br><br></p><p>From the Bad Voltage site: Every two weeks Bad Voltage delivers an amusing take on technology, Open Source, politics, music, and anything else we think is interesting, as well as interviews and reviews. Do note that Bad Voltage is in no way related to <a href="http://www.linuxquestions.org/?ref=jeremyg.dev">LinuxQuestions.org</a>, and unlike LQ it will be decidedly NSFW. That said, head over to the Bad Voltage website, take a listen and let us know what you think.</p>]]></content:encoded></item><item><title><![CDATA[Bad Voltage Episode 80 Has Been Released: The Two-Percenters]]></title><description><![CDATA[<p>In this episode, we devote the whole show to a different format: a wide-ranging discussion on Linux adoption and market share, following the news that it&#x2019;s been trending up and over 2% consistently for a while now. Taking in the current state of hardware, Steam gaming, new devices</p>]]></description><link>https://www.jeremyg.dev/bad-voltage-episode-80-has-been-released-the-two-percenters/</link><guid isPermaLink="false">699ca52f8b49560001ad303c</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Thu, 01 Dec 2016 20:33:01 GMT</pubDate><content:encoded><![CDATA[<p>In this episode, we devote the whole show to a different format: a wide-ranging discussion on Linux adoption and market share, following the news that it&#x2019;s been trending up and over 2% consistently for a while now. Taking in the current state of hardware, Steam gaming, new devices from everyone else, and whether mobile is eating desktop or not, myself, Stuart Langridge, Bryan Lunduke and Jono Bacon dive deep into where Linux is going and whether we want it to get there at all.</p><p><strong>Listen to 1&#xD7;80: <a href="http://www.badvoltage.org/2016/12/01/1x80/?ref=jeremyg.dev">The Two-Percenters</a></strong><br><br></p><p>--jeremy</p><p>From the Bad Voltage site: Every two weeks Bad Voltage delivers an amusing take on technology, Open Source, politics, music, and anything else we think is interesting, as well as interviews and reviews. Do note that Bad Voltage is in no way related to <a href="http://www.linuxquestions.org/?ref=jeremyg.dev">LinuxQuestions.org</a>, and unlike LQ it will be decidedly NSFW. That said, head over to the Bad Voltage website, take a listen and let us know what you think.</p>]]></content:encoded></item><item><title><![CDATA[Bad Voltage Episode 77 Has Been Released: Wax Cylinder Coming Soon]]></title><description><![CDATA[<p>Stuart Langridge, Jono Bacon, Bryan Lunduke, and myself present Bad Voltage, in which three idiots fail to recognize the glory of having the theme tune from The League Of Gentlemen as one&apos;s ringtone, we create Garcia&apos;s Law, and:</p><ul><li>00:02:01 Google have long been a</li></ul>]]></description><link>https://www.jeremyg.dev/bad-voltage-episode-77-has-been-released-wax-cylinder-coming-soon/</link><guid isPermaLink="false">699ca52f8b49560001ad303b</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[Google]]></category><category><![CDATA[Open Hardware]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Thu, 20 Oct 2016 14:41:21 GMT</pubDate><content:encoded><![CDATA[<p>Stuart Langridge, Jono Bacon, Bryan Lunduke, and myself present Bad Voltage, in which three idiots fail to recognize the glory of having the theme tune from The League Of Gentlemen as one&apos;s ringtone, we create Garcia&apos;s Law, and:</p><ul><li>00:02:01 Google have long been a player in the chat or IM ecosystem. But just lately their approach in this area seems to be getting more and more confused. What&apos;s the deal, big G? You&apos;ve got Allo and Duo and GTalk and Hangouts... what&apos;s the end goal here?</li></ul><ul><li>00:24:33 Open sourcing your <em>hardware</em>. Kyle from OpenMYR, who are <a href="https://www.kickstarter.com/projects/77886650/wifi-motors?ref=jeremyg.dev">currently kickstartering wifi-controllable motors1</a>, asks the BV team: are we doing the right thing, publishing the hardware source for our creations? When&apos;s the right time to open your hardware: before it exists, after it exists, or never? We look into the question and give some thoughts</li></ul><p><strong>Listen to 1&#xD7;77: <a href="http://www.badvoltage.org/2016/10/20/1x77/?ref=jeremyg.dev">Wax Cylinder Coming Soon</a></strong></p><p>&#x2013;jeremy</p><p>From the Bad Voltage site: Every two weeks Bad Voltage delivers an amusing take on technology, Open Source, politics, music, and anything else we think is interesting, as well as interviews and reviews. Do note that Bad Voltage is in no way related to <a href="http://www.linuxquestions.org/?ref=jeremyg.dev">LinuxQuestions.org</a>, and unlike LQ it will be decidedly NSFW. That said, head over to the Bad Voltage website, take a listen and let us know what you think.</p>]]></content:encoded></item><item><title><![CDATA[Bad Voltage: Philips Hue vs LifX, and are smart bulbs a good idea?]]></title><description><![CDATA[<p>On the next episode of Bad Voltage, we discuss whether smart bulbs are a good idea. To get the conversation rolling, I started out with a brief introduction of two systems I use: Hue and LifX. Here&apos;s how the segment starts:</p><blockquote>The first system I have running is</blockquote>]]></description><link>https://www.jeremyg.dev/bad-voltage-philips-hue-vs-lifx-and-are-smart-bulbs-a-good-idea/</link><guid isPermaLink="false">699ca52f8b49560001ad303a</guid><category><![CDATA[Bad Voltage]]></category><category><![CDATA[home automation]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Wed, 21 Sep 2016 16:13:05 GMT</pubDate><content:encoded><![CDATA[<p>On the next episode of Bad Voltage, we discuss whether smart bulbs are a good idea. To get the conversation rolling, I started out with a brief introduction of two systems I use: Hue and LifX. Here&apos;s how the segment starts:</p><blockquote>The first system I have running is Philips Hue. Based on the low-power, wireless mesh network zigbee standard this system requires a hub to operate. The Hue line offers a wide variety of options, including standard lights, accent lights, spot lights, light strips, integrated switches and more. Setup is a breeze and while the stock app could be more intuitive the large number of 3rd party applications and integrations more than make up for that. The bulbs are bright and color saturation is acceptable. One down side to this option is that it&apos;s on the pricier end of the spectrum.<br><br>The second system I have running is LifX. Based on traditional wifi, no additional hub is needed. The LifX line is limited to standard white and color bulbs. Setup is once again a breeze and the stock app is intuitive and full featured. It includes some nice touches such as cool effects baked into the app that you can only get with Hue by using 3rd party apps. The number of 3rd party integrations isn&apos;t as large as Hue, but has been growing steadily recently. The bulbs have the greatest brightness and color saturation of any smart bulb I&apos;ve seen. The price of LifX bulbs are comparable to Hue.<br><br>Depending on your needs and design requirements, I&apos;d recommend both systems. There are less expensive options from GE, Wink, WeMo, Cree and others but I&apos;ve never used them so cannot comment on how they compare. With that brief intro out of the way let&apos;s get to the first question my co-presenters had. Are smart bulbs a good idea? Let me give you a few examples of how I use the bulbs and then we&apos;ll get the discussion going from there. First, on the more practical side I have a bunch of automations setup that make my home safer and more convenient. Open the front door when it&apos;s dark outside and my living room lights go on. Open the basement door and the basement lights go on (which is especially handy while doing laundry). Next, as I have Redshift adjust the color temperature of my screens at night, the lights in my office also adjust to reduce the amount of blue light as it get later. Lastly, on the less practical side, when my favorite team scores a touchdown various lights in my house flash the team colors. So, fellow presenters, what do you think?<br><br><br><br></blockquote><p><br><a href="http://www.badvoltage.org/2016/09/22/1x75/?ref=jeremyg.dev">Turn in tomorrow</a> to hear what my fellow presenters think. In the mean time, what is your opinion on smart bulbs?</p><p>--jeremy</p>]]></content:encoded></item><item><title><![CDATA[Moto 360 Sport Review (AKA the worst customer support experience I've ever had)]]></title><description><![CDATA[<p>I&apos;m an avid runner. And while I&apos;ve run with an Android phone and various apps for quite some time, I&apos;ve been increasingly wanting an Android Wear device that would make my many Garmin wearing running mates covetous. Enter the Moto 360 Sport, one of</p>]]></description><link>https://www.jeremyg.dev/moto-360-sport-review-aka-the-worst-customer-support-experience-ive-ever-had/</link><guid isPermaLink="false">699ca52f8b49560001ad3039</guid><category><![CDATA[Android]]></category><category><![CDATA[Reviews]]></category><category><![CDATA[Android Wear]]></category><category><![CDATA[Moto]]></category><category><![CDATA[Motorola]]></category><dc:creator><![CDATA[Jeremy G]]></dc:creator><pubDate>Thu, 18 Aug 2016 14:44:37 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;m an avid runner. And while I&apos;ve run with an Android phone and various apps for quite some time, I&apos;ve been increasingly wanting an Android Wear device that would make my many Garmin wearing running mates covetous. Enter the Moto 360 Sport, one of the first true Android GPS-enabled running smart watches. Considering how much I liked the <a href="https://www.jeremyg.dev/moto-360-generation-2-smartwatch-review/">Moto 360 Gen 2</a>, I was eagerly awaiting the 360 Sport, which was announced at the same time as the Gen 2 but had a later release date.</p><figure class="kg-card kg-image-card"><a href="https://www.jeremyg.dev/content/images/2026/02/moto360sport-jpeg.jpg"><img src="https://www.jeremyg.dev/content/images/2026/02/moto360sport-jpeg-w-300.jpg" class="kg-image" alt="moto360sport" loading="lazy" width="300" height="195"></a></figure><p>The 45mm device comes with the same size 1.37&quot; display (including flat tire) as the Gen 2, but the AnyLight Hybrid display makes it easily readable even in sunny conditions. The silicone strap comes in Black, White, and Flame Orange but as it&apos;s part of a unibody construction it is not changeable. While many reviewers have found the strap to be a lint magnet, after over a month of use I did not find that to be an issue. The device has an optical heart rate monitor, barometric altimeter, accelerometer, ambient light sensor, gyroscope and a 300mAh battery. Like the Gen 2, it is IP67 dust and water resistant.</p><p>Moving on to using the device, I found the construction to be solid and the watch comfortable to wear even during long runs. Most popular running apps have Android Wear support at this point, although I&apos;ve found most (I regularly use both Strava and Endomondo and extensively tested Runtastic, Runkeeper, Map My Run, and Ghostracer) have at least one annoying issue that needs to be addressed before being a true competitor to dedicated running watches. The platform also seems to be a bit temperamental, which resulted in me missing out on data points for a couple interesting runs. For example, the data for my Boilermaker run (a 15k) shows over an hour of activity but a distance traveled of zero. That particular issue seems to related to a known bug with Endomondo and Wear devices that have GPS. On the note of the GPS, I found it to be roughly as accurate as my phone GPS, although getting a lock takes substantially longer. It&apos;s less useful than I hoped though, as using the GPS and active display means the battery life isn&apos;t sufficient for longer runs. The device has 4GB of internal memory which you can play music from, although I did not test this feature. I found the heart rate monitor to be accurate enough to be useful and a nice addition to my running metrics.</p><p>So, what&apos;s the verdict? Although the Moto 360 Sport lacks more advanced features such as cadence and VO2 max, it&apos;s a very capable device. For shorter runs it will allow you to leave the smartphone at home, and for long runs being able to see stats during your run while being able to move your phone from an armband to a pouch makes for a more enjoyable experience. The display really is top notch. With the original MSRP of $299 already marked down to $199 it&apos;s a device I would have tacitly recommended now and as the platform matures I could have seen that turn into a much stronger recommendation. I was definitely looking forward to the second iteration of the device.</p><p><strong>Enter Motorola Support</strong></p><p>Unfortunately after 47 days of use, the device rebooted while I was running then shut off. Once I got home and put it on the charger it went into a boot loop. I did some research online and found out some other people had a similar issue. While most weren&apos;t able to fix their device, I found one suggestion that involved completely draining the battery then charging it overnight. This worked a single time, but during the next run the device shut off and further research and troubleshooting were not able to resuscitate it. I was a little bummed, but these things happen with electronic devices and I went to the Motorola support site to start the RMA process. This is where the experience gets unfortunate and things did not start out well.</p><p>I tried multiple times to begin the process online, but received the following error: &quot;100-02. Oops!!!&quot; After that error persisted for a few days, I finally called support. Unfortunately support was not able to verify the serial number on my device, despite multiple attempts which included me sending them a photo of the sticker affixed to the box which contains both the SKU and serial number. After some back and forth I ask for an RMA despite the serial number issue, as the device comes with a year warranty and has not been out for even close to a year yet. I understand they have legitimate reasons for needing the serial number, but they can get that off the device once they have it. In this context, it&apos;s not needed to validate warranty coverage. The rep said they could not proceed without a &quot;scanned copy of the receipt&quot;, despite me pointing out that 100% of Moto 360 Sports have to be in warranty. I also explained that as this is 2016 I purchased the device online and do not have a receipt to scan. After some additional back and forth, on August 2nd I send them a screenshot of the online order, while also pointing out this is a pretty silly thing to have to do. At this point I just want to get the process moving.</p><p>On August 4th I get a response saying: &quot;In regards the replacement/repair process, we get an error from the system, in that case we opened a VHD ticket which is going to have a resolution within 24 to 48 business hours&quot;</p><p>On August 8th, I get an update: &quot;I wanted to let you know that I am following up your case, and that I have not received confirmation that the VHD ticket has been solved, but I already verified with the team in charge of it, they told me they are working on it.&quot;</p><p>At this point I reach out to @Moto_support, but am told: &quot;Please follow up with us via email&quot;. I also now note that I am using this device to write a review for a site that gets quite a bit of traffic, hoping that will help expedite things. It does not.</p><p>On August 10th, I get an additional update: &quot;I am contacting you to provide you updates about the VHD ticket submitted, it is still being worked by the team in charge.&quot; It&apos;s now been over a week since I initially opened a ticket with the support rep.</p><p>On August 11th the VHD issue is solved. They want me to ship them the device so they can evaluate it and then either repair or replace it, or give them $25 for the &quot;Advanced Exchange program&quot;. I explain that after over a week of waiting, the fee on the AE program should be waived and a device should be sent ASAP. They eventually agree. Via the email ticket I give them all contact information as requested. Shortly after I get a voice mail from Motorola with no callback number and no email contact info that ends with &quot;just email us back, okay&quot;. I guess this means reply to the ticket, which I do.</p><p>On the 12th, I get a call from Motorola. They now say the fee cannot be waived because the system will not let this happen, but it can be refunded after the fact. I point out that this directly contradicts what was previous said by them. They persist. I eventually capitulate and give them my credit card information. The experience at this point is getting really frustrating and taking up far too much time (believe it or not, this is just an overview of the event which included quite a few calls and back-and-forth emails over trivial issue and re-re-re-confirming information). I get an RMA email while I am still on the phone with the rep, which is encouraging. I just want to run and I now think a new device is on the way. I am sorely mistaken.</p><p>A short time later I get an email saying the credit card is &quot;invalid&quot;. We confirmed the number on the phone three times; it is not invalid. During the next call I note that it&apos;s odd that the card would be invalid as I received an RMA. I am told: &quot;even though you received shipping labels or tracking numbers, the system sends the emails automatically, that is why you received them, but in the system they did not go through&quot;. This makes no sense, but I give my credit card details again. I get another RMA while on the phone, but notice that it&apos;s for the incorrect device (a Moto 360 Gen 2, not a Moto 360 Sport). Looking back, the first RMA was also for the incorrect device. It is explained to me that this is normal and not an issue. A couple hours later I am told that my credit card was now declined. I have used this exact card before and after the RMA and the card is nowhere near its limit. I call the credit card company. There have been zero attempts from Motorola and zero declined transactions for the day. I am now starting to lose my patience.</p><p>On the next call I explain that the number is correct and the card has not been declined. They suggest I try to submit the request online again. I get the same &quot;100-02. Oops!!!&quot; error. I point out how ridiculous this is getting. The rep now suggests that I use a different serial number than the one that is on the box. This does not seem normal. Using the new serial number does get me past the previous error, however, and may explain the incorrect device issue. I now get a credit card error. I point out that it&apos;s odd that the system never asks for a CVV, but they don&apos;t seem to know what I am referring to. I try the online system again with a new card. One that has a zero balance and that I rarely use. This time I am met with success. They double check the system and everything looks good. Hooray!</p><p>Except, no. On the 15th I get an email: &quot;I am contacting you to provide you updates about your case, I was checking it, and I found that unfortunately the order is cancel for invalid or missing Credit Card number&quot;. I explain that this is odd even for this increasingly odd situation as I now not only have a 3rd RMA, which has been confirmed by Motorola, but a tracking number from FedEx. Surely the tracking number means a replacement device is on the way. I am told: &quot;You have received FedEx shipping confirmation because shipping information and credit card information are being processed by a different systems.&quot; I check my credit card statement and I have two pending transactions for different amounts:</p><p>Aug 12, 2016 MOTOROLA MOBILITY LLC $244.68<br>Aug 12, 2016 MOTOROLA MOBILITY LLC $250.86<br></p><p>They now ask for a &quot;bank statement&quot;. I tell them in no uncertain terms that they are not getting one and am now starting to lose my temper. They ask me to submit the request again from scratch. I point out how absurd this entire interaction has been and also note that the Fed Ex tracking number they gave shows that something has actually shipped. Between that and the pending charges, I think their system is incorrect and the third RMA has been processed. They do not agree. They also do not have an explanation for the multiple charges for different amounts, neither of which they see on their end.</p><p>On the 16th they touch base on the ticket. I respond with: &quot;To confirm: All RMA&apos;s have failed in some way and nothing has shipped, despite me receiving a tracking number. Is that correct?&quot;</p><p>I received the following response on August 17th: &quot;That is correct all RMA&apos;s have failed, and nothing has been shipped despite the tracking numbers you received.&quot; I also received a package from Motorola. Containing a Motorola DROID phone. A PHONE! I can&apos;t even begin to fathom how that&apos;s even possible, considering the packing list actually says &quot;MOTO3602SPORT - MOTO 360 (2ND GEN)&quot; on it. I called my credit card company again, and at no time were any transactions declined. They do see both pending transactions from &quot;MOTOROLA MOBILITY LLC&quot; but &quot;they are set to fall off your account because they were never finalized by the merchant&quot;. Once they are no longer pending, I figure the phone is a gift and I plan to see if the Moto 360 Sport will blend. The DROID is a Verizon model, if anyone knows a charity in need please contact me. In the mean time, I&apos;m in the market for an Android Wear running watch.</p><figure class="kg-card kg-image-card"><a href="https://www.jeremyg.dev/content/images/2026/02/img_20160817_154305.jpg"><img src="https://www.jeremyg.dev/content/images/2026/02/img_20160817_154305-w-225.jpg" class="kg-image" alt="IMG_20160817_154305" loading="lazy" width="225" height="300"></a></figure><p>Based on the above experience I must unfortunately recommend avoiding all Motorola products at this time, which is a shame. The outrageously bad support is a large blemish on a company that is putting out solid quality products. I still think the Moto 360 Gen 2 is one of the best Android Wear watches currently available. In fact, I&apos;ve purchased the device for family and friends and it&apos;s been very well received. Quite a few people have told me they purchased one based on my review and the feedback has been positive. I like the Moto 360 Sport and some of the phones look very nice. That said, the support experience above was so terrible, the Motorola internal systems are so broken and the issues so systemic in nature that I would not feel right if one single person had to go through the above based on a recommendation I have made. So, at least for now, keep away. Far.Away. And Motorola Support, please get your act together.</p><figure class="kg-card kg-image-card"><a href="https://www.jeremyg.dev/content/images/2026/02/moto-360-sport-debacle.png"><img src="https://www.jeremyg.dev/content/images/2026/02/moto-360-sport-debacle-w-300.png" class="kg-image" alt="Moto 360 Sport Debacle" loading="lazy" width="300" height="150"></a></figure><p>Note: Any text in quotes above are a direct copy/paste of the interaction. Luckily I have much of this in writing or on voice mails, but some did take place on the phone. Happy to provide supporting details if so desired. I have reached out and it appears I am not alone in this kind of experience with Motorola Support.</p><p>UPDATE: They are now mysteriously able to see that the RMA &quot;went through, and I can see the device arrived to your home&quot;. The rep also added: &quot;I will ask you to send us the device since with the Advance Exchange submitted a hold has been put on the card you used, if you do not send us back the device the hold will become a charge.&quot; which is in direct opposition to the statement I have in writing from the 17th that confirms there are no holds on my card. Let it sink in for a minute that the system they use is so bad, they don&apos;t actually know if they are billing you or not.</p><p>UPDATE (August 19th): Someone from the &quot;Executive Customer Relations&quot; team (which based on the email address appears to be part of the office of the CEO) reached out to me. They included a tracking label to overnight the phone to them and said they would overnight me the correct watch as soon as they received the phone. So, progress. I had the phone to FedEx within an hour, and noted it would be a show of good faith for them to overnight me the watch now, since the issue has been going on for roughly three weeks already and we&apos;re getting to the weekend. They responded, and insinuated they could do so but would not as a result of something I said in this post (the comment about the phone being a gift). My response: &quot;Considering the show of good faith I made by having the package at Fed Ex within an hour of receiving your email AND the fact that we are on week three of this absolutely terrible customer experience AND the fact that I provided proof of shipping AND the fact that we&apos;re on a weekend boundary that will cause another delay, I&apos;m hoping you decide to ship something out ASAP&quot;. I also included a photo of the Fed Ex receipt. They never responded, which is pretty disappointing and seems for lack of a better word...vindictive. I guess I&apos;ll now be running at LinuxCon with no Moto 360 Sport. I also made it clear that this is no longer about me getting a working device. The readers, listeners and conference-goers that I have recommended Motorola products to or whom have seen me wear the device on stage and have made a purchase as a result deserve to know the systemic issues I encountered are being addressed. They completely ignored that part of my email but I will work to get it addressed. Stay tuned for further updates.</p><p>UPDATE (August 20th): After posting the previous update I also sent a very frank email to the Executive Customer Relations team. They had received the phone at this point and responded saying they decided to send me a new Moto 360 Sport via Saturday deliver, which I just received. Hopefully this marks the end of my particular issue. On to the broader issue, they said &quot;We have completed a deep dive on your case and sent off coaching and feedback to ensure this does not occur in the future&quot;, which is encouraging. I&apos;ve responded noting that the technical system they use should really be evaluated, as the number of cascading failures just should not be possible (remember: the system allowed for the creation of an RMA when one doesn&apos;t exist, showed one card as declined when my credit card company confirms it was not, put two holds for different amounts on a second card but then canceled the RMA while somehow still sending out a device, which then ended up being the incorrect device. &#xA0;The billing issues are especially worrisome and it looks doubly bad when a tech company has this many technical failures). It is my hope based on their response that they will look into the failures and hopefully other people will not have to go through an experience similar to the one I have.</p>]]></content:encoded></item></channel></rss>