Posts

Showing posts from August, 2026

I Wired Google Search Console Into My Publishing Pipeline and Immediately Hit Someone Else's Google Account

I'd been checking my blog's search traffic by hand -- log into Search Console, click the property, read two numbers, close the tab -- often enough that wiring it into a script felt like an obvious next step. What I didn't expect was to spend the first ten minutes of that "obvious next step" locked out of my own property by a Google account I'd forgotten I was signed into. Why I wanted this as a script instead of a habit Everything else in this project already reports on itself through small Python scripts -- how many posts are live, how many views each one has on dev.to. Search Console was the one piece still living entirely in a browser tab, which meant it was also the one piece I sometimes forgot to check. Wrapping it in the same pattern as the others -- run a script, read three numbers -- was less about saving clicks and more about making it something I'd actually keep doing. The Search Console API needs its own OAuth scope ( webmasters.readonly ) ...

My OAuth Tokens Kept Expiring Every 7 Days, and the Reason Was a Dropdown Labeled 'Testing'

Three weeks into running my publishing pipeline on autopilot, it just stopped. Not with a crash -- with the exact same error I'd already spent a week debugging and fixing once before: invalid_grant: Token has been expired or revoked . Same message, same script, same working setup. I assumed I'd broken my own fix. I hadn't. This was a completely different bug wearing the same disguise, and it had been sitting there from day one, counting down. The first time I saw this error The first time invalid_grant showed up, I'd just spent days chasing a silent scheduled-publish failure that turned out to be a PowerShell file encoding bug. Once that was fixed and confirmed working for a couple of runs, I filed the OAuth error away as "collateral damage from the encoding mess" and moved on. When it came back three weeks later, with the encoding fix still verified working, that theory stopped holding up. My setup uses the OAuth installed-app flow: run the script once,...

I Checked Google's Own Billing Console So You Don't Have To: The Real Text-to-Speech Free Tier, Voice by Voice

Image
I went looking for one number -- how many characters of WaveNet audio I get for free every month on Google Cloud Text-to-Speech -- and found two sources that flatly contradicted each other. One search result, synthesized from several pricing-comparison sites, said the free tier was alive and generous: 4M Standard characters, 1M WaveNet, 1M Neural2, stacking every month. A second source, fetched directly from a different pricing-aggregator page, said the opposite in plain language: "Google Cloud Text-to-Speech does not offer a free plan as of August 2026." Same product, same month, opposite claims. Neither of those sites is Google. So I stopped trusting either one and went to check the only source that could actually settle it -- my own billing account. Where the real numbers live Google Cloud's console has a page most people never open on purpose: Billing → Pricing , which lists every SKU tied to your billing account along with its tiered pricing, filterable by service...

What 'Free' Actually Means Across a Multi-Service Google Stack

I want to be upfront about something before this post goes any further: I don't have a clean dollar figure to show you. I went looking for one -- I wanted to open the Google Cloud billing console, screenshot a $0.00 total, and call it proof. What I found instead was that "free" across a multi-service Google stack isn't one number at all. It's a pile of separate ceilings, each with its own reset clock, its own fine print, and in at least one case, a wall that had nothing to do with usage limits and everything to do with a policy I didn't know existed. This is the more honest version of that post -- what "free" actually meant, service by service, including the parts that cost me time instead of money. The free tiers that behaved exactly like the docs said Two services in this pipeline were boring in the best way -- I read the limit once, stayed under it, and never thought about it again. Blogger API v3 has no meaningful quota for a single-author ...

My Service Account Key Got Blocked By an Org Policy I Didn't Know Existed

The error didn't even try to be helpful: FAILED_PRECONDITION: Key creation is not allowed on this service account. No link, no suggestion, no explanation of which policy was doing this or why. I'd asked Google Cloud for a JSON key file for a brand-new service account on a brand-new project I owned outright, and it said no. This is the story of the two hours I spent trying to fight that, and the one afternoon I saved myself by giving up and doing it a different way instead. Why I wanted a service account key in the first place Every Google Cloud tutorial that touches server-to-server automation reaches for the same pattern: create a service account, generate a key, drop the JSON file next to your script, point GOOGLE_APPLICATION_CREDENTIALS at it, done. It's the default advice for a reason -- it's non-interactive, it doesn't expire the way OAuth tokens can feel like they will, and there's no browser consent screen involved. For a script that was going to cal...

The Silent Scheduled-Task Failure Nobody Warns You About (And How I Caught It)

Image
Last week, a blog post I had scheduled to auto-publish at 9pm simply didn't. No error in my inbox, no crash log, nothing. Windows Task Scheduler's own history said the task had run and succeeded . It hadn't. Here's what was actually going on, because the failure mode is a lot more common than the one blog post I eventually found on it suggested. The setup My publishing pipeline is a Python script ( publish.py ) wrapped in a small PowerShell script, registered as a Windows Task Scheduler job set to fire at a specific time even if the machine is asleep ( WakeToRun ). The work PC sleeps overnight, wakes itself for the scheduled task, runs the script, goes back to sleep. That part works reliably. Why Task Scheduler said "success" when it wasn't The Python script failed with a DNS resolution error trying to reach oauth2.googleapis.com -- the machine had woken up, but the network adapter hadn't finished reconnecting yet. That part is almost expected...

Why I Picked Blogger Over WordPress for a Build-in-Public Blog in 2026

Every "start a blog" guide defaults to WordPress, so it's worth explaining why this one runs on Blogger instead. It wasn't nostalgia — it came down to three practical factors for this specific project. 1. Zero hosting cost, permanently WordPress.org needs hosting (a real monthly cost, even if small) or you're on WordPress.com's managed tiers, which limit plugins, ads, and themes at the free level. Blogger is hosted by Google, free, with no storage or bandwidth bill ever showing up. For a project explicitly built around a zero-budget constraint, this alone was close to decisive. 2. A working, current API This was the bigger factor. Blogger's API v3 is REST-based, OAuth-authenticated, and — as I confirmed by actually using it — fully functional in 2026 . WordPress also has a REST API and it's arguably more powerful, but self-hosting it means also managing security updates, backups, and uptime — overhead a fully-automated, unattended publishing pipe...

Reading the Fine Print on 'Free' AI Tools: 5 Questions to Check First

After going through the terms of several "free" AI tools for this project, a pattern showed up enough times that it's worth writing down as a checklist. If you're evaluating any free AI tool — not just the ones I mention here — these are the five questions that actually matter, roughly in order of how often they trip people up. 1. Does it reset, or is it one-time? "200 free credits" reads very differently depending on whether that's a monthly refill or a signup bonus you'll never see again. I've seen both marketed with nearly identical language. Always find the renewal cadence before estimating what a free tier actually gets you over a month. 2. Is there a hard cap that breaks your use case? A generous-sounding credit allowance doesn't help if the underlying output is capped somewhere that matters — an 8-second maximum clip length, a resolution ceiling, a rate limit that throttles bursts. Check the cap against what you're actually t...

Google's Free Tiers Compared: Cloud TTS vs. Translate vs. Flow

Every Google Cloud product has a free tier. What "free tier" actually means — in generosity, in usability, in whether it's enough to run something real on — varies enormously between products. I ended up relying on three of them for this project's pipeline, so here's what each one actually gives you, not what the marketing page implies. Cloud Text-to-Speech: genuinely generous Standard and WaveNet voices come with 4 million free characters a month; Neural2 voices get 1 million. These limits reset monthly, not daily, and they don't require a paid upgrade to keep using indefinitely — it's a permanent free tier, separate from the one-time $300 trial credit every new account also gets. For a project generating a few thousand characters of narration a week, this tier is effectively unlimited. This is the one free tier in this list I'd call unambiguously generous. Cloud Translation API: also generous, less commonly needed 500,000 characters a month, fr...