<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://nik.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nik.me/" rel="alternate" type="text/html" /><updated>2026-08-22T02:40:35+00:00</updated><id>https://nik.me/feed.xml</id><title type="html">Nik’s Crappy Blog</title><subtitle>Thoughts and observations... usually geeky.</subtitle><author><name>Nik</name></author><entry><title type="html">Claude, Gemini, I Can’t Quit You Neither</title><link href="https://nik.me/cant-quit-you-neither/" rel="alternate" type="text/html" title="Claude, Gemini, I Can&apos;t Quit You Neither" /><published>2026-08-20T14:00:00+00:00</published><updated>2026-08-20T14:00:00+00:00</updated><id>https://nik.me/cant-quit-you-neither</id><content type="html" xml:base="https://nik.me/cant-quit-you-neither/">&lt;p&gt;I am spending too much money on AI.&lt;/p&gt;

&lt;p&gt;Two subscriptions at home, three at work. Every couple of months I open the billing page with the intention of killing one, and every couple of months I close it without doing anything. This post is me trying to figure out why.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;the-setup&quot;&gt;The setup&lt;/h3&gt;

&lt;p&gt;I’m a Google fanboy from way back, as I’ve mentioned more than once. Watch, phone, car, Chromebook, TV. That means Gemini is getting shoved at me at all times, whether or not I asked. Sometimes appreciated. Mostly interruptive.&lt;/p&gt;

&lt;p&gt;At work we’ve been finding out about the limits of AI the hard way, which has produced our own little Skynet of self-replicating agents running business processes and saving hundreds of hours. (Those are their savings numbers. An argument could also be made that they invented enough new business processes to offset a chunk of that. We’re pruning.)&lt;/p&gt;

&lt;p&gt;From my own desktop, separate from anything company-wide, I’m deep in ChatGPT, Claude, and Gemini. They handle administrative work, draft documents, do research, and comb through hours of meeting transcripts to pull out the three things that mattered. Wired up to other tools over &lt;a href=&quot;/gemini-spark-cloud-run-mcp/&quot;&gt;MCP&lt;/a&gt;, plus the AI baked into most marketing platforms now, they also take on a good amount of client work that used to be pointing and clicking. (Aside: automating that stuff is quietly shifting client engagements toward strategy, where they used to get mired in production work for the first month or two.)&lt;/p&gt;

&lt;p&gt;At home things are simpler. Until AI can do the dishes, my needs are modest. Though I do moonlight as marketing director for my wife’s business, which is where the requirements get real again.&lt;/p&gt;

&lt;h3 id=&quot;which-model-is-actually-better&quot;&gt;Which model is actually better?&lt;/h3&gt;

&lt;p&gt;Nearly every AI comparison I run into is written from an engineering standpoint. SWE-bench scores, how cleanly it one-shots a React component, context window size, tokens per second. Which makes sense, because software developers are either the heaviest users of this stuff or at minimum the loudest, and the whole conversation is mostly them talking to each other. But it means the conversation measures things I almost never do, and skips right past the things normies do all day.&lt;/p&gt;

&lt;p&gt;So this is the other version. Someone who writes, researches, drafts documents, automates the tedious parts of his own job, and does marketing on the side, sizing up three models on that basis.&lt;/p&gt;

&lt;p&gt;What I’ve learned across work and home is that some models are just better than others at specific things. Long-form writing: Claude. Short-form writing: Claude. Business tasks involving calendars and documents: Claude. Making a decision inside a messy problem, like driving a browser to accomplish something: Claude.&lt;/p&gt;

&lt;p&gt;You can see where this is going.&lt;/p&gt;

&lt;p&gt;Gemini is embarrassingly mediocre at all of it, which is a strange thing to say about a product that was clearly ahead of the pack a couple of years ago. Ask it for a long document and it craps out around two pages no matter how hard you push on word count. Ask it for a blog post and it reads like someone mashed every business bro on LinkedIn into a style guide. Email isn’t much better.&lt;/p&gt;

&lt;p&gt;And Claude Cowork, ahh, I love it. It’s really made for breaking down projects and work streams, running complex agents without me hovering over them, and reusing skills across jobs so I’m not re-explaining myself every Monday. An enormous amount of actual work-work gets done in there.&lt;/p&gt;

&lt;p&gt;So here I am. Two subscriptions at home, three at work, Claude clearly the better model, and I still can’t bring myself to cancel Gemini. Why?&lt;/p&gt;

&lt;h3 id=&quot;because-gemini-is-playing-a-different-game&quot;&gt;Because Gemini is playing a different game&lt;/h3&gt;

&lt;p&gt;Claude gets the nod on everything an LLM is supposed to be. Gemini isn’t really competing there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini makes pictures.&lt;/strong&gt; Only occasionally useful, and the watermark makes it less so (you can work around that by going straight to the API), but highly entertaining. Yes, I acknowledge I am killing the environment to make silly pictures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini turns anything into a podcast.&lt;/strong&gt; This sounds insane right up until you have a dense research topic and forty minutes of dishes ahead of you, and two peppy fake hosts give you the rundown. I’ve used it to prep for D&amp;amp;D adventures and to compress an interminable business-self-improvement e-book into an hour that contained the four good ideas in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini builds apps on top of spreadsheets.&lt;/strong&gt; The Canvas feature in Sheets. Sure, I could ask Claude to vibe-code something, connect it to Google Sheets, and get a similar result. But the output is pretty rough unless you understand data models and can write a decent programming prompt. With Gemini it was one prompt, one refinement, and I had a genuinely good scheduling optimizer.&lt;/p&gt;

&lt;p&gt;Plus they’ve made it able to &lt;a href=&quot;https://blog.google/products-and-platforms/platforms/android/gemini-intelligence/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;clean up a rambling voice note into a sendable text&lt;/a&gt;, &lt;a href=&quot;https://blog.google/products-and-platforms/platforms/android/gemini-intelligence/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;build a home screen widget from a description&lt;/a&gt;, &lt;a href=&quot;https://blog.google/innovation-and-ai/products/gemini-app/gemini-drop-april-2026/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;write three minutes of music&lt;/a&gt;, &lt;a href=&quot;https://blog.google/innovation-and-ai/products/gemini-app/gemini-drop-april-2026/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;drop an interactive 3D model into the middle of a chat&lt;/a&gt;, and &lt;a href=&quot;https://blog.google/innovation-and-ai/products/notebooklm/generate-your-own-cinematic-video-overviews-in-notebooklm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;turn a research pile into an animated video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The through-line is accessibility. Nothing to connect, nothing to host, no extra subscription.&lt;/p&gt;

&lt;p&gt;Could I get Claude to do these things? Yeah, probably. I could vibe-code something that talks to a spreadsheet. I could wire up some text-to-podcast service over MCP. But I’d have to do it. I’d have to connect it. I’d have to buy subscriptions to all of it. And the vibe-coded spreadsheet app is an hour of bug fixes and data model refinement before it works, plus somewhere to host the thing when it does.&lt;/p&gt;

&lt;h3 id=&quot;so-heres-where-ive-landed&quot;&gt;So here’s where I’ve landed&lt;/h3&gt;

&lt;p&gt;Gemini is there to do stuff. It watches my calendar and summarizes my inbox. It makes a picture of my cat with butterfly wings to send to my nephew. It searches across everything Google knows and turns the result into a podcast or an infographic. It tells me how well I slept last night (note to self: turn this off, I can generally assess my own restedness by standing up). In Android world it apparently also makes watch faces and widgets and drives my phone.&lt;/p&gt;

&lt;p&gt;Google has cleverly gated the good stuff behind a subscription, but that subscription comes with generous usage limits, a pile of Drive storage, and better features across a bunch of Google apps. It’s not a bad deal.&lt;/p&gt;

&lt;p&gt;And Gemini will also do LLM stuff. It’ll write a short document, a generic email, a LinkedIn post. It does okay. Not great, but fine. The job gets done with all the skill of a high school intern.&lt;/p&gt;

&lt;p&gt;It’s also fast as heck. Even the Pro model makes Claude feel creaky. It’s very possible that latency is a big part of why Claude reads as smarter.&lt;/p&gt;

&lt;p&gt;If I weren’t doing work for my wife’s business, where I need something with enough taste to update a blog and enough precision to write SQL against a data warehouse, I could get by on Gemini alone.&lt;/p&gt;

&lt;p&gt;But I do need that extra sharpness here and there. So two subscriptions it is, at least for now. I may start cancelling Claude and re-upping it in the months I actually need it, which feels like a petty little victory I’ll enjoy for about one billing cycle. And I’ll keep an eye on Spark to see whether it ever gets close enough to be my at-home Cowork substitute.&lt;/p&gt;

&lt;h3 id=&quot;and-chatgpt&quot;&gt;And ChatGPT?&lt;/h3&gt;

&lt;p&gt;Zero need. I’ve run head-to-heads, and it beats Gemini at some things and Claude at others. It isn’t better in any way at all than the combination of the two, and I’m already paying for both.&lt;/p&gt;

&lt;p&gt;That subscription, at least, I can cancel.&lt;/p&gt;</content><author><name>Nik</name></author><category term="ai" /><category term="gemini" /><category term="claude" /><summary type="html">I am spending too much money on AI. Two subscriptions at home, three at work. Every couple of months I open the billing page with the intention of killing one, and every couple of months I close it without doing anything. This post is me trying to figure out why.</summary></entry><entry><title type="html">Plugging the MCP Limitations of Gemini Spark</title><link href="https://nik.me/gemini-spark-cloud-run-mcp/" rel="alternate" type="text/html" title="Plugging the MCP Limitations of Gemini Spark" /><published>2026-08-15T17:00:00+00:00</published><updated>2026-08-15T17:00:00+00:00</updated><id>https://nik.me/gemini-spark-cloud-run-mcp</id><content type="html" xml:base="https://nik.me/gemini-spark-cloud-run-mcp/">&lt;p&gt;Ever wanted Gemini Spark to talk to something Google doesn’t own?&lt;/p&gt;

&lt;p&gt;I use Claude at work every day, and for good reason. It’s great at what it does, and Anthropic’s ecosystem makes wiring up third-party tools as simple as clicking a button. But for my personal setup, I’m a complete Google fanboy. I use Gemini Spark constantly because I love that it can run unattended in the background and has deep, native ties into the rest of my Google life (Gmail, Calendar, Drive, and Docs).&lt;/p&gt;

&lt;p&gt;The trouble starts the moment you step outside that walled garden. I spent a Saturday trying to point Spark at my own MCP server and got “Account linking required” about two hundred times in a row. No useful error, no logs worth reading, just a login loop that would not close. I came pretty close to handing a middleman $20 a month to make it somebody else’s problem.&lt;/p&gt;

&lt;p&gt;I didn’t, and it turns out the whole thing runs for free. Here’s what it took.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;what-is-model-context-protocol&quot;&gt;What is Model Context Protocol?&lt;/h3&gt;

&lt;p&gt;If you haven’t run into it yet, the &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Model Context Protocol (MCP)&lt;/a&gt; does for LLMs roughly what Services did for the Mac. Instead of every app building a bespoke integration with every other app, there’s one agreed-on way to expose a capability and one agreed-on way to call it. Write the tool once, and any model that speaks MCP can discover it, pull context from it, and act on it.&lt;/p&gt;

&lt;h3 id=&quot;why-wont-spark-just-connect-to-an-existing-mcp-server&quot;&gt;Why won’t Spark just connect to an existing MCP server?&lt;/h3&gt;

&lt;p&gt;Claude lets you click a pre-built connector or point at a local command, and it just works. Spark is a different animal:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Almost no built-in connectors:&lt;/strong&gt; Spark has practically zero out-of-the-box integrations for third-party tools compared to Claude’s catalog.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Strict HTTPS and OAuth 2.0 requirements:&lt;/strong&gt; Gemini Spark only connects to remote MCP servers over public HTTPS endpoints protected by OAuth 2.0.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That second requirement is the real roadblock. It immediately rules out standard local &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stdio&lt;/code&gt; MCP servers (the kind that run on your laptop for desktop apps). Worse, it also breaks a lot of hosted community MCP servers that “ought to” work out of the box, because they don’t implement the exact OAuth flow Spark expects.&lt;/p&gt;

&lt;h3 id=&quot;how-do-you-connect-your-own-tools-without-paying-for-a-connector-service&quot;&gt;How do you connect your own tools without paying for a connector service?&lt;/h3&gt;

&lt;p&gt;If you search around for ways to solve this, the internet will happily point you toward connector clearinghouses like Composio. Those services work fine if you’re an enterprise with a company card, but for personal use, paying a $20-$50/month middleman tax just to let an AI model check a repository or run a script on a Saturday afternoon makes zero sense.&lt;/p&gt;

&lt;p&gt;I wanted something lightweight, fully under my own control, and free (or at most a few pennies a month).&lt;/p&gt;

&lt;p&gt;Almost none of this is my work. &lt;a href=&quot;https://github.com/jlowin/fastmcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FastMCP&lt;/a&gt; is the Python framework doing the actual heavy lifting: it handles the protocol, the tool registration, and the OAuth scaffolding, and you can stand up a working MCP server with it in about a dozen lines. Everything I added is glue, plus workarounds for Spark’s particular quirks.&lt;/p&gt;

&lt;p&gt;The rest of the recipe is &lt;strong&gt;Google Cloud Run&lt;/strong&gt; to host it and &lt;strong&gt;Google Cloud Firestore&lt;/strong&gt; to hang onto tokens. Cloud Run gives you an instant HTTPS endpoint with automatic SSL and scales all the way down to zero instances when idle. The always-free tier covers 2 million requests a month, and it stays pretty cheap as you ramp up past that. A personal MCP server that only runs when you ask it a question sits comfortably inside the free tier. When you aren’t chatting with Spark, you pay literally $0.&lt;/p&gt;

&lt;h3 id=&quot;what-does-it-take-to-make-cloud-run-and-fastmcp-actually-work&quot;&gt;What does it take to make Cloud Run and FastMCP actually work?&lt;/h3&gt;

&lt;p&gt;Deploying a FastMCP container to Cloud Run sounds simple on paper, and it is right up until Spark tries to log in. Four gotchas, all of which cost me an embarrassing amount of a Saturday:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;The PKCE vs. Basic Auth loop:&lt;/strong&gt; FastMCP advertises &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;client_secret_basic&lt;/code&gt; support in its metadata by default. When Spark sees this, it tries to use HTTP Basic Auth instead of PKCE (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;none&lt;/code&gt;), which is the infinite “Account linking required” loop from the top of this post. The fix is monkeypatching FastMCP’s metadata generator at startup to strip the basic auth methods. It’s a few lines. Finding them took most of the afternoon.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dynamic Client ID loss on scale-to-zero:&lt;/strong&gt; Gemini Spark registers dynamic client IDs during setup. But when Cloud Run scales down to zero, that in-memory registration disappears with the container. The next cold boot rejects Spark with “Client ID not found,” which is a fun one to debug because it only happens after you walk away for twenty minutes. A custom &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ResilientGoogleProvider&lt;/code&gt; synthesizes valid client records on the fly whenever a cold container starts. Related and nastier: if your OAuth consent screen is set to External and left in &lt;strong&gt;Testing&lt;/strong&gt; status, Google expires your refresh tokens after seven days. Everything works beautifully on day one and then dies the following week with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;invalid_grant&lt;/code&gt;, looking for all the world like a storage bug. Publish the app (no verification review needed for basic scopes) or use Internal if you’re on Workspace.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lost tokens on ephemeral disks:&lt;/strong&gt; FastMCP writes OAuth refresh tokens to local disk by default. On Cloud Run, container filesystems are ephemeral and vanish on restarts and new deploys, so every deploy logs you out. Backing FastMCP with an encrypted Firestore collection keeps tokens alive across container lifecycles without paying for a persistent virtual disk.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Acting as the user, not the service account:&lt;/strong&gt; By default, Cloud Run executes API calls using its default machine service account, which has access to precisely none of your personal data. Instead, the server pulls the caller’s OAuth bearer token out of the incoming request, so tools run with your real permissions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole boilerplate, Dockerfile, and deployment scripts are in the &lt;a href=&quot;https://github.com/nikjft/spark-cloud-run-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;spark-cloud-run-mcp repo on GitHub&lt;/a&gt;, with step-by-step setup instructions and the code behind all four fixes above.&lt;/p&gt;

&lt;h3 id=&quot;is-it-secure&quot;&gt;Is it secure?&lt;/h3&gt;

&lt;p&gt;Reasonably, in that it runs on your own OAuth permissions rather than some third party’s. But it was all vibe-coded on a weekend, so be careful before you point an MCP server at anything that touches your wallet. Start with things where the worst case is embarrassing rather than expensive.&lt;/p&gt;

&lt;h3 id=&quot;what-can-you-do-with-it&quot;&gt;What can you do with it?&lt;/h3&gt;

&lt;p&gt;Once the bridge is in place, you can hook Spark into pretty much anything without ongoing overhead. A few ways I’m using it today:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Analytics and data diagnostics:&lt;/strong&gt; Custom tools that pull reporting and run checks for some personal projects.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A real GitHub integration:&lt;/strong&gt; Gemini is inexplicably missing a built-in GitHub integration (and hopefully one they’ll fix, since it’s seamless in with Antigravity), so I wired up my own MCP server to search repos, pull commits, inspect PRs, and review diffs directly from chat.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Connecting something new:&lt;/strong&gt; These days I can usually find an existing MCP server for whatever I want to talk to, run the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloud-run-spark-mcp&lt;/code&gt; skill that’s included in the repo, and walk through a bit of configuration. It’s pretty dialed in and repeatable at this point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not as slick as clicking a connector button in Claude, and I wouldn’t hand it to someone who’d rather not think about OAuth at all. But it costs nothing, it runs on my own permissions instead of a vendor’s, and connecting something new is mostly a matter of pointing the skill at it. For a weekend project that mostly stays out of my way, that’s a fine trade.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This blog’s been empty for years because my blogging has mostly shown up at &lt;a href=&quot;https://mcgaw.io/blog/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;McGaw.io&lt;/a&gt; instead.&lt;/em&gt;&lt;/p&gt;</content><author><name>Nik</name></author><category term="gemini" /><category term="ai" /><summary type="html">Ever wanted Gemini Spark to talk to something Google doesn’t own? I use Claude at work every day, and for good reason. It’s great at what it does, and Anthropic’s ecosystem makes wiring up third-party tools as simple as clicking a button. But for my personal setup, I’m a complete Google fanboy. I use Gemini Spark constantly because I love that it can run unattended in the background and has deep, native ties into the rest of my Google life (Gmail, Calendar, Drive, and Docs). The trouble starts the moment you step outside that walled garden. I spent a Saturday trying to point Spark at my own MCP server and got “Account linking required” about two hundred times in a row. No useful error, no logs worth reading, just a login loop that would not close. I came pretty close to handing a middleman $20 a month to make it somebody else’s problem. I didn’t, and it turns out the whole thing runs for free. Here’s what it took.</summary></entry><entry><title type="html">Bookmarklet to Toggle Google Accounts</title><link href="https://nik.me/toggle-google-accounts-bookmarklet/" rel="alternate" type="text/html" title="Bookmarklet to Toggle Google Accounts" /><published>2019-07-31T00:00:00+00:00</published><updated>2019-07-31T00:00:00+00:00</updated><id>https://nik.me/toggle-google-accounts-bookmarklet</id><content type="html" xml:base="https://nik.me/toggle-google-accounts-bookmarklet/">&lt;p&gt;I use Google Apps at work and also have a personal Google account for many other things. Switching between these accounts can be annoying, as can dealing with clicking on share links that open in the wrong account.&lt;/p&gt;

&lt;p&gt;To get around this, I put together this bookmarklet that switches between two accounts automatically. You’ll need to be logged into both accounts at once in order for this to work.&lt;/p&gt;

&lt;p&gt;To make it work, create a new bookmark and paste in the JS &lt;a href=&quot;https://gist.github.com/nikjft/0f12cd7832f742dccba56ae2f4959752&quot;&gt;from this gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve only tested this in Chrome, but it ought to work in other browsers. Also, if you have three or more accounts, this will just switch between the first two.&lt;/p&gt;</content><author><name>Nik</name></author><summary type="html">I use Google Apps at work and also have a personal Google account for many other things. Switching between these accounts can be annoying, as can dealing with clicking on share links that open in the wrong account. To get around this, I put together this bookmarklet that switches between two accounts automatically. You’ll need to be logged into both accounts at once in order for this to work. To make it work, create a new bookmark and paste in the JS from this gist. I’ve only tested this in Chrome, but it ought to work in other browsers. Also, if you have three or more accounts, this will just switch between the first two.</summary></entry><entry><title type="html">A Better Keyboard</title><link href="https://nik.me/a-better-keyboard/" rel="alternate" type="text/html" title="A Better Keyboard" /><published>2019-04-09T00:00:00+00:00</published><updated>2019-04-09T00:00:00+00:00</updated><id>https://nik.me/a-better-keyboard</id><content type="html" xml:base="https://nik.me/a-better-keyboard/">&lt;p&gt;I’d heard a lot of complaints about how bad the 2015+ MacBook keyboards were. Well, for the first time, I’m using one daily, and I have to agree. I don’t think I’m slower typing on it (if anything, the short travel makes it pretty easy to pound out a sentence), but it’s harder on the fingers and just doesn’t feel “good.” So far no problems with stuck keys, but it’s only been a few weeks.&lt;/p&gt;

&lt;p&gt;Of course, when I get home and break out my Chromebook, I’m immediately struck at how nice its keyboard is. Keys have short travel, so it still feels speedy, but are satisfyingly responsive and smooth feeling.&lt;/p&gt;

&lt;p&gt;Here’s the thing… my Chromebook cost me about $350. This MacBook pro is, what, a $2,000 computer?&lt;/p&gt;

&lt;p&gt;Just too bad. Apple’s put style way too far forward at the sake of a pleasant day-to-day experience. (And don’t even get me started on the touch bar, lack of a touch screen… I could go on.)&lt;/p&gt;</content><author><name>Nik</name></author><category term="mac" /><category term="chromebook" /><summary type="html">I’d heard a lot of complaints about how bad the 2015+ MacBook keyboards were. Well, for the first time, I’m using one daily, and I have to agree. I don’t think I’m slower typing on it (if anything, the short travel makes it pretty easy to pound out a sentence), but it’s harder on the fingers and just doesn’t feel “good.” So far no problems with stuck keys, but it’s only been a few weeks. Of course, when I get home and break out my Chromebook, I’m immediately struck at how nice its keyboard is. Keys have short travel, so it still feels speedy, but are satisfyingly responsive and smooth feeling. Here’s the thing… my Chromebook cost me about $350. This MacBook pro is, what, a $2,000 computer? Just too bad. Apple’s put style way too far forward at the sake of a pleasant day-to-day experience. (And don’t even get me started on the touch bar, lack of a touch screen… I could go on.)</summary></entry><entry><title type="html">Having fun with Jekyll</title><link href="https://nik.me/having-fun-with-jekyll/" rel="alternate" type="text/html" title="Having fun with Jekyll" /><published>2019-04-08T00:00:00+00:00</published><updated>2019-04-08T00:00:00+00:00</updated><id>https://nik.me/having-fun-with-jekyll</id><content type="html" xml:base="https://nik.me/having-fun-with-jekyll/">&lt;p&gt;A new CMS is always a present. New toys, new things to learn…&lt;/p&gt;

&lt;p&gt;So far, I’ve added &lt;a href=&quot;/search&quot;&gt;full text search&lt;/a&gt; via client-side JS (didn’t know how good that could be!), “oranged” up the theme, and the usual array of troubleshooting to get analytics, 404s, and all that jazz working correctly. End result: this blog’s more functional than the Tumblr platform. (Sad.)&lt;/p&gt;

&lt;p&gt;As I expected, Jekyll’s lack of a server-side CMS is troublesome, since it’s a multi-step process to post anything. I can’t just “share” from my phone to Tumblr. (Not that I ever did that anyhow!)&lt;/p&gt;

&lt;p&gt;Unexpectedly, I’m really liking using git for content management and syncing of posts between devices. It’s fast, I have a huge amount of control… just really cool.&lt;/p&gt;

&lt;p&gt;Next up is seeing about whether a &lt;a href=&quot;https://nodered.org&quot;&gt;node-red server&lt;/a&gt; fills in that critical automation gap so I can start wiring in IFTTT webhooks to get everyone playing nicely with one another.&lt;/p&gt;</content><author><name>Nik</name></author><category term="jekyll" /><category term="inside-baseball" /><summary type="html">A new CMS is always a present. New toys, new things to learn… So far, I’ve added full text search via client-side JS (didn’t know how good that could be!), “oranged” up the theme, and the usual array of troubleshooting to get analytics, 404s, and all that jazz working correctly. End result: this blog’s more functional than the Tumblr platform. (Sad.) As I expected, Jekyll’s lack of a server-side CMS is troublesome, since it’s a multi-step process to post anything. I can’t just “share” from my phone to Tumblr. (Not that I ever did that anyhow!) Unexpectedly, I’m really liking using git for content management and syncing of posts between devices. It’s fast, I have a huge amount of control… just really cool. Next up is seeing about whether a node-red server fills in that critical automation gap so I can start wiring in IFTTT webhooks to get everyone playing nicely with one another.</summary></entry><entry><title type="html">Changing CMSes Again!</title><link href="https://nik.me/hello-world/" rel="alternate" type="text/html" title="Changing CMSes Again!" /><published>2019-04-01T21:32:44+00:00</published><updated>2019-04-01T21:32:44+00:00</updated><id>https://nik.me/hello-world</id><content type="html" xml:base="https://nik.me/hello-world/">&lt;h2 id=&quot;hello-world&quot;&gt;Hello World!&lt;/h2&gt;

&lt;p&gt;Working on trying something new… static sites are all the rage, so I’m pimping things out with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jekyll&lt;/li&gt;
  &lt;li&gt;GitHub&lt;/li&gt;
  &lt;li&gt;Netlify&lt;/li&gt;
  &lt;li&gt;CodeAnywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s right, a full CI process, multiple virtual servers, and distributed source control for a blog that’s had one post since the end of 2016. (Two, counting this one!)&lt;/p&gt;

&lt;p&gt;And you wouldn’t believe how much work it was to get this all working nicely on my Chromebook Plus, which is running on an ARM processor.&lt;/p&gt;

&lt;p&gt;Oh, and yes, every download link is broken. That’s actually not entirely my fault - most were hosted on Google Drive and they killed the ability to share web server style links. If there’s an applet or script you want, email me.&lt;/p&gt;

&lt;p&gt;Hey, a boy has to have a hobby…&lt;/p&gt;</content><author><name>Nik</name></author><category term="jekyll" /><category term="inside-baseball" /><summary type="html">Hello World! Working on trying something new… static sites are all the rage, so I’m pimping things out with: Jekyll GitHub Netlify CodeAnywhere That’s right, a full CI process, multiple virtual servers, and distributed source control for a blog that’s had one post since the end of 2016. (Two, counting this one!) And you wouldn’t believe how much work it was to get this all working nicely on my Chromebook Plus, which is running on an ARM processor. Oh, and yes, every download link is broken. That’s actually not entirely my fault - most were hosted on Google Drive and they killed the ability to share web server style links. If there’s an applet or script you want, email me. Hey, a boy has to have a hobby…</summary></entry><entry><title type="html">Email to app for an app with no web service (2Do)</title><link href="https://nik.me/email-to-app-for-an-app-with-no-web-service-2do/" rel="alternate" type="text/html" title="Email to app for an app with no web service (2Do)" /><published>2018-11-28T19:58:36+00:00</published><updated>2018-11-28T19:58:36+00:00</updated><id>https://nik.me/email-to-app-for-an-app-with-no-web-service-2do</id><content type="html" xml:base="https://nik.me/email-to-app-for-an-app-with-no-web-service-2do/">&lt;p&gt;I personally am a big fan of &lt;a href=&quot;https://www.2doapp.com/&quot;&gt;2Do&lt;/a&gt; as a daily task manager. I’ve tried a lot of alternatives, but that’s always where I end up. But unlike most task managers these days, it’s app-only, there’s no web service. So if I want to use some of the great tools out there (like &lt;a href=&quot;https://www.taskclone.com/&quot;&gt;TaskClone&lt;/a&gt;, which is a killer tool for any hardcore Evernote junkie), I’m stuck. Sure, I can AppleScript some stuff on a Mac, but now that I’m moving more and more onto Chromebooks, that’s not such a great option.&lt;/p&gt;&lt;p&gt;Well, I do have one device that runs 2Do and is turned on pretty much all the time: My phone. Since I have an Android phone, 2Do’s iOS email-to-task won’t work for me, but Android’s nothing if not a deep bag of tricks, so by stringing together &lt;a href=&quot;https://tasker.joaoapps.com/&quot;&gt;Tasker&lt;/a&gt;, &lt;a href=&quot;https://joaoapps.com/join/&quot;&gt;Join&lt;/a&gt;, and &lt;a href=&quot;https://www.zapier.com/&quot;&gt;Zapier&lt;/a&gt;, I have a fully functional email-to-2Do utility.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;b&gt;The steps:&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A Zapier email task that connects to&amp;hellip;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;A Join API webhook that&amp;hellip;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Triggers a Tasker profile that&amp;hellip;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Sends an app intent to 2Do&amp;hellip;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Which creates a task&lt;br/&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Step 1: Get your Join API Key&lt;/p&gt;&lt;p&gt;Log into Join (on the web), click on API, and copy your API key (hidden in this screenshot for obvious reasons).&lt;/p&gt;&lt;figure data-orig-width=&quot;1032&quot; data-orig-height=&quot;547&quot; class=&quot;tmblr-full&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/9583648c2294074dad18451b9511da15/tumblr_inline_pix59znyMm1r4dp1n_540.png&quot; data-orig-width=&quot;1032&quot; data-orig-height=&quot;547&quot;/&gt;&lt;/figure&gt;&lt;p&gt;Step 2: Create a Tasker task&lt;/p&gt;&lt;p&gt;The Tasker setup simply looks for a Join message and triggers an Intent called “com.google.android.gms.actions.CREATE_NOTE”.&lt;/p&gt;&lt;figure data-orig-width=&quot;1080&quot; data-orig-height=&quot;1920&quot; class=&quot;tmblr-full&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/a9d775a7391e80909073e967d01219a8/tumblr_inline_pix5tfP9Ou1r4dp1n_540.png&quot; data-orig-width=&quot;1080&quot; data-orig-height=&quot;1920&quot;/&gt;&lt;/figure&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;figure data-orig-width=&quot;1080&quot; data-orig-height=&quot;1920&quot; class=&quot;tmblr-full&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/83b5b6cc572f8b359b882a52f1e6dab8/tumblr_inline_pix5u3ANsX1r4dp1n_540.png&quot; data-orig-width=&quot;1080&quot; data-orig-height=&quot;1920&quot;/&gt;&lt;/figure&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;And finally, a Zapier zap that just receives an email and forwards it on to a webhook - just pass in the API Key and your device names as request variables.&lt;/p&gt;&lt;figure data-orig-width=&quot;379&quot; data-orig-height=&quot;385&quot; class=&quot;tmblr-full&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/b70e7518268e758d3284682a19d829d9/tumblr_inline_pix5xcPzMO1r4dp1n_540.png&quot; data-orig-width=&quot;379&quot; data-orig-height=&quot;385&quot;/&gt;&lt;/figure&gt;&lt;hr&gt;&lt;figure class=&quot;tmblr-full&quot; data-orig-height=&quot;737&quot; data-orig-width=&quot;801&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/eb5a30492cb19da3528b1e6af0118c02/tumblr_inline_pix5ythCIC1r4dp1n_540.png&quot; data-orig-height=&quot;737&quot; data-orig-width=&quot;801&quot;/&gt;&lt;/figure&gt;&lt;p&gt;Now you just send an email to the address Zapier provides, and the email subject will get pushed right into 2Do.&lt;/p&gt;&lt;p&gt;This works easily enough with any other app that accepts intents. Just edit the setup as necessary.&lt;/p&gt;&lt;p&gt;One small issue with this approach is that there’s no way to parse things out so that the task name is the subject and add the email body as a note - instead I have to cram everything into one line. Not horrible from a “just toss it into the inbox and triage it later” point of view, but not ideal. Maybe I can talk 2Do’s developer into adding some custom intents to handle this, or better yet, a Tasker plugin!&lt;/p&gt;</content><author><name>Nik</name></author><summary type="html">I personally am a big fan of 2Do as a daily task manager. I’ve tried a lot of alternatives, but that’s always where I end up. But unlike most task managers these days, it’s app-only, there’s no web service. So if I want to use some of the great tools out there (like TaskClone, which is a killer tool for any hardcore Evernote junkie), I’m stuck. Sure, I can AppleScript some stuff on a Mac, but now that I’m moving more and more onto Chromebooks, that’s not such a great option.Well, I do have one device that runs 2Do and is turned on pretty much all the time: My phone. Since I have an Android phone, 2Do’s iOS email-to-task won’t work for me, but Android’s nothing if not a deep bag of tricks, so by stringing together Tasker, Join, and Zapier, I have a fully functional email-to-2Do utility.</summary></entry><entry><title type="html">My Keyboard Maestro Macros and AppleScripts I use the most</title><link href="https://nik.me/my-keyboard-maestro-macros-and-applescripts-i-use/" rel="alternate" type="text/html" title="My Keyboard Maestro Macros and AppleScripts I use the most" /><published>2016-05-07T16:18:46+00:00</published><updated>2016-05-07T16:18:46+00:00</updated><id>https://nik.me/my-keyboard-maestro-macros-and-applescripts-i-use</id><content type="html" xml:base="https://nik.me/my-keyboard-maestro-macros-and-applescripts-i-use/">&lt;p&gt;As one of the three readers of my blog, you&amp;rsquo;ve no doubt realized I&amp;rsquo;m on a bit of a Keyboard Maestro kick these days. I&amp;rsquo;ve been a KM user since 2010, a QuicKeys user before that, and a rabid AppleScripter before then. I’ve built up a tremendous library of scripts and macros in that time, many of which I’ve shared on this blog. However, of these macros, there&amp;rsquo;s a handful that have proven truly &amp;ldquo;sticky&amp;rdquo; and that I continue to expand upon and use on a daily or near-daily basis. I though my few readers might get more benefit from learning about these truly indispensable scripts and macros than the more esoteric mini-programs that I&amp;rsquo;ve posted here.&lt;/p&gt;

&lt;p&gt;I haven&amp;rsquo;t posted all of these scripts and macros because most of them are fairly obvious in how they work, and enough have very specific settings for my networks, or even contain sensitive information (app tokens and such), that I didn&amp;rsquo;t want to go through the effort and &amp;ldquo;sanitize&amp;rdquo; them. But if you want to see any specific ones, sound off in the comments or bug me on the Keyboard Maestro forum and I&amp;rsquo;ll be glad to help you out.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3&gt;Apps:&lt;/h3&gt;

&lt;p&gt;I do not have hotkeys for opening apps, I leave that to LaunchBar. I do however have some that hide apps when they go to the background since they hog the screen and don&amp;rsquo;t use drag-and-drop much (if at all), specifically TurboTax, Keyboard Maestro Editor, Google Music (in Fluid), and Parallels Desktop.&lt;/p&gt;

&lt;p&gt;Bring all windows to front: With Finder and Terminal, activating the app will also bring all of its windows to the front. This keeps me from opening lots of superfluous windows, and probably meets some expectation I have from back in the &amp;ldquo;layered apps&amp;rdquo; days of Classic MacOS.&lt;/p&gt;

&lt;p&gt;Send to LaunchBar: For some of my most frequently used apps, I have an AppleScript that mimics LaunchBar’s “instant send” feature and just places the file I’m working on into LaunchBar.&lt;/p&gt;

&lt;p&gt;For Outlook (a program I use all the time and basically despise), I have a macro that breaks me out of search mode, goes back to the Mail view, and clicks on the top mailbox. This is normally a multi-step ordeal of de-selecting and re-selecting things. I use this fifty times a day if I use it once.&lt;/p&gt;

&lt;p&gt;I also have a set of macros for Outlook that more or less replicate SaneBox’s “SaneLater” folders - letting me put messages in deferred folders that are then recovered anywhere from an hour later to the following week.&lt;/p&gt;

&lt;p&gt;Clean and email Word doc: I spend a lot of time dealing with change tracking and comments in MS Office documents. I hate accidentally mailing a file with change tracking still enabled or, worse still, compromising comments or change notes. This script takes the Word document I’m viewing and makes a copy without any change notes, comments, or embedded authoring information, and then creates a new email in Outlook with the file attached.&lt;/p&gt;

&lt;p&gt;Evernote: I have about twenty scripts I’ve written for Evernote, but the AppleScript support for Evernote hasn’t been attended to for many versions and has simply decayed over time to the point that it’s unreliable.&lt;/p&gt;

&lt;h3&gt;Finder:&lt;/h3&gt;

&lt;p&gt;Maybe the Finder’s an app, but it gets its own category for me.&lt;/p&gt;

&lt;p&gt;Send: Typing a &amp;ldquo;⌘→”, gives me a palette of operations I can carry out on the current selection. These include folders I frequently move things to, compressing (zip and 7z), emailing, posting to Slack, backing up to cloud storage, and uploading to my common SFTP destinations.&lt;/p&gt;

&lt;p&gt;New File from Template: This creates a new file in the current folder based on some templates I have stored in my documents folder - just duplicates the file to my current folder. (I have one for Evernote, too, that places the file in a note as an attachment.)&lt;/p&gt;

&lt;p&gt;Group selection in folder: This is a handy little script that takes my currently selected items and puts them all in a newly-created folder. Great for gathering up a handful of downloaded attachments, or cleaning up a cluttered folder.&lt;/p&gt;

&lt;p&gt;Terminal tab: This script opens a terminal tab with the prompt in the current Finder folder. There are many like this, but this one is mine and works just the way I want it to.&lt;/p&gt;

&lt;p&gt;Archive old files on add: This is a folder action that triggers when I add a new file. It takes every file in that folder that&amp;rsquo;s more than 14 days old (either by added, created or modified dates) and puts them in an &amp;quot;Old Files&amp;rdquo; folder in a date-stamped folder for the month and year. I use this in my Downloads folder and my &amp;ldquo;Outbox&amp;rdquo; folder, which is sort of a temporary storage space for work in progress files. Then I can easily clean up my older files by looking at the date of their containing folders. I have a similar folder action for the Desktop that puts old desktop items in the Outbox folder (which, in turn, ages them out after 14 days).&lt;/p&gt;

&lt;h3&gt;Web:&lt;/h3&gt;

&lt;p&gt;There are macros for all my browsers (Firefox, Chrome, Safari) that will let me take the current URL and open it in another browser (via a palette).&lt;/p&gt;

&lt;p&gt;I also have a little macro to trigger an AppleScript that closes tabs to the left of the current browser tab. There&amp;rsquo;s already a menu item to close tabs to the right, but not the left. Go figure. Now I have both.&lt;/p&gt;

&lt;p&gt;Print-like-a-normal-person: Chrome&amp;rsquo;s standard print dialog is a travesty. I use KM to make CMD+P open a standard Mac print dialog. I&amp;rsquo;ve done the same in other programs that march to their own printing drum.&lt;/p&gt;

&lt;p&gt;I have a macro for Chrome that&amp;rsquo;s rather single-purpose, but it goes through the process to buy a monthly work-sponsored bus pass. This is one of the more esoteric ones that I&amp;rsquo;m really glad I did. It&amp;rsquo;s about eight steps which is just enough that I&amp;rsquo;d put it off until I could pay more attention. Once I found myself with an expired pass as I got on the bus, I put this together so that I can just select it in the status menu and get it done right away.&lt;/p&gt;

&lt;h3&gt;Text Expansions&lt;/h3&gt;

&lt;p&gt;I gave up TextExpander a few years ago out of a desire to cut down on the number of oddball apps I ran on my Mac, and moved all my text expansions to Keyboard Maestro. Of these expansions, I&amp;rsquo;ve found myself using a number of them frequently, and a much greater number infrequently-to-never. The ones I use a lot are:&lt;/p&gt;

&lt;p&gt;Email signatures: I have them for work, for personal accounts, and a couple for specific purposes (e.g. business-type communications from my personal email).&lt;/p&gt;

&lt;p&gt;Conference call information: Automatically insert my join.me phone number and link, I use it all the time when setting up meetings at work.&lt;/p&gt;

&lt;p&gt;Programming/scripting text expansions: Mostly just for Script Editor, AppleScript and JavaScript, really. It includes a combination of common functions (dialogs, tell app&amp;hellip;) and routines I use and re-use all the time (escape clipboard, sorting, etc.).&lt;/p&gt;

&lt;p&gt;Things I like to misspell: I get certain words wrong all the time. This helps. Only downside is that I still don&amp;rsquo;t spell them correctly so when I&amp;rsquo;m on another computer/phone/tablet, I&amp;rsquo;m out of luck.&lt;/p&gt;

&lt;p&gt;Special characters: If I type &amp;ldquo;;cc” (all my text expansions are prefixed by a semicolon), I get a palette of my most frequently used special characters - keyboard shortcut keys, ellipses, checkboxes, arrows, Mac keyboard modifier key symbols, fun ASCII shruggies and other complex goofs, and my favorite emoji characters.&lt;/p&gt;

&lt;p&gt;Date and time stamps: I have a handful of different date stamp and time stamp formats that I use for naming files, taking notes, adding comments to things.&lt;/p&gt;

&lt;h3&gt;Locations:&lt;/h3&gt;

&lt;p&gt;Home and Work: I have wifi-triggered macros for home and work that open or close certain applications, set my default printer, and (in the case of work), mute my computer so that if I have a video on in the browser or something it doesn&amp;rsquo;t bother my co-workers.&lt;/p&gt;

&lt;p&gt;I also have a set of macros triggered by the same networks that simply enable and disable macro groups for each location. These macro groups contain repeating scheduled macros that do things specific to each location - notably kicking off my time tracking macro while I’m in the office.&lt;/p&gt;

&lt;p&gt;Tethering: When I use my phone&amp;rsquo;s hotspot mode, I have a macro that quits all my bandwidth hogging apps that sync things (email, Google Drive, Box Sync, Evernote, Google Music Manager) and pauses CrashPlan&amp;rsquo;s backups. Then there&amp;rsquo;s another that re-starts these things when I re-connect.&lt;/p&gt;

&lt;h3&gt;Paste:&lt;/h3&gt;

&lt;p&gt;I have a steadily growing set of macros, all with the hotkey of CTRL+OPT+V. This ends up bringing up a selection palette where I can paste in a variety of ways. Some of them get used more than others, but they&amp;rsquo;re all useful:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Totally Plain Text: This runs a BBEdit text factory that straightens quotes, zaps gremlins, removes leading and trailing white space, wraps hard line breaks, and cuts everything down to emoji-less ASCII.&lt;/li&gt;
&lt;li&gt;Paste by typing clipboard: this types out each individual character on the clipboard to get around applications that seem to think it’s a security risk to paste into a field.&lt;/li&gt;
&lt;li&gt;Clean and expand URL: This goes through an array of routines to resolve shortened or redirected urls, strip affiliate and GTM codes, and otherwise make it pretty.&lt;/li&gt;
&lt;li&gt;Shorten and decorate URL: This does the opposite, it creates a short URL and adds Google Analytics tracking codes to it.&lt;/li&gt;
&lt;li&gt;Paste image at various sizes: If I copy an image (often a screenshot), this makes it easy to shrink to a more reasonable size as a courtesy when I&amp;rsquo;m pasting it inline in an email or to Slack. My current sizes are 50%, 500px, and 1024px, more come and go now and again.&lt;/li&gt;
&lt;li&gt;Paste HTML as Markdown, Markdown as HTML, rich text as HTML/Markdown, HTML/Markdown as rich text, etc&amp;hellip; Every possibly gyration of dealing with styled text. All are powered by textutil and PanDoc (which is a bother to install, but so much more useful than multimarkdown).&lt;/li&gt;
&lt;li&gt;HTML and URL encode/decode: Turn text strings into URL or HTML-safe text, or alternatively undo the same. I spend no small amount of time dealing with web services and paths for HTML files, so this is a big time saver.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Miscellaneous:&lt;/h3&gt;

&lt;p&gt;Presentation Mode: I give a fair number of presentations and demos, so I have a gloriously complex AppleScript that gets my computer ready:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Moves my desktop contents into a single tidy folder&lt;/li&gt;
&lt;li&gt;Turns off sleep mode, screen dimming and any screensavers&lt;/li&gt;
&lt;li&gt;Sets a boring corporate desktop picture&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;This script acts as a toggle, so if I run it again, desktop icons are restored to their original position, power settings are set back to where they were, and the desktop picture is restored. This is a dangerous script, though, as it&amp;rsquo;s a simple recipe for quickly exhausting my MacBook&amp;rsquo;s battery life.&lt;/p&gt;

&lt;p&gt;Placeholder text and images: In order to mock up websites, I have a handful of generators for FPO content, including a steadily growing array of Lorem Ipsum type generators (the original, plus one based on Noam Chomsky’s writings, another on late-90’s internet hype, and a new one I put together based on the current presidential campaign hyperbole), an FPO image/link generator (using fpoimg.com), and a random name generator for filling out forms.&lt;/p&gt;

&lt;p&gt;Lock Screen: Simple macro - just locks my screen via a keyboard shortcut. I use it before I go to the bathroom at work so people don&amp;rsquo;t see what&amp;rsquo;s on my screen. Good habit to get into.&lt;/p&gt;</content><author><name>Nik</name></author><summary type="html">As one of the three readers of my blog, you&amp;rsquo;ve no doubt realized I&amp;rsquo;m on a bit of a Keyboard Maestro kick these days. I&amp;rsquo;ve been a KM user since 2010, a QuicKeys user before that, and a rabid AppleScripter before then. I’ve built up a tremendous library of scripts and macros in that time, many of which I’ve shared on this blog. However, of these macros, there&amp;rsquo;s a handful that have proven truly &amp;ldquo;sticky&amp;rdquo; and that I continue to expand upon and use on a daily or near-daily basis. I though my few readers might get more benefit from learning about these truly indispensable scripts and macros than the more esoteric mini-programs that I&amp;rsquo;ve posted here. I haven&amp;rsquo;t posted all of these scripts and macros because most of them are fairly obvious in how they work, and enough have very specific settings for my networks, or even contain sensitive information (app tokens and such), that I didn&amp;rsquo;t want to go through the effort and &amp;ldquo;sanitize&amp;rdquo; them. But if you want to see any specific ones, sound off in the comments or bug me on the Keyboard Maestro forum and I&amp;rsquo;ll be glad to help you out.</summary></entry><entry><title type="html">Fancy Keyboard Maestro Custom HTML Prompts</title><link href="https://nik.me/fancy-keyboard-maestro-custom-html-prompts/" rel="alternate" type="text/html" title="Fancy Keyboard Maestro Custom HTML Prompts" /><published>2016-04-09T20:25:42+00:00</published><updated>2016-04-09T20:25:42+00:00</updated><id>https://nik.me/fancy-keyboard-maestro-custom-html-prompts</id><content type="html" xml:base="https://nik.me/fancy-keyboard-maestro-custom-html-prompts/">&lt;figure data-orig-width=&quot;540&quot; data-orig-height=&quot;276&quot; class=&quot;tmblr-full&quot;&gt;&lt;img src=&quot;https://66.media.tumblr.com/5c2401c8916ebfd190de988153200e7e/tumblr_inline_o5dviwcBWM1r4dp1n_540.png&quot; alt=&quot;image&quot; data-orig-width=&quot;540&quot; data-orig-height=&quot;276&quot;/&gt;&lt;/figure&gt;&lt;p&gt;A library of Custom HTML Prompt macros with some CSS and JS to make them look pretty and Mac-like as well as have some interface functions that aren’t provided by the standard KM dialogs. &lt;br/&gt;&lt;/p&gt;&lt;p&gt;Specifically:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A El-Capitan-style alert box with multiple buttons&lt;br/&gt;&lt;/li&gt;&lt;li&gt;A multiple checkboxes dialog to select multiple items from a pick-list&lt;br/&gt;&lt;/li&gt;&lt;li&gt;A type-ahead box to select from a pick-list (like a combo-box)&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This requires a little bit of extra installation work. You’ll need to move the html-elements folder to ~/Library/Application Support/Keyboard Maestro. If you want it somewhere else, you can edit the variable in the macros themselves.&lt;/p&gt;&lt;p&gt;Download: &lt;a href=&quot;http://ift.tt/22krmhG&quot;&gt;Fancy HTML Prompts.zip&lt;/a&gt; (zip, 240312 bytes)&lt;/p&gt;</content><author><name>Nik</name></author><category term="software" /><category term="files" /><category term="scripts" /><summary type="html">A library of Custom HTML Prompt macros with some CSS and JS to make them look pretty and Mac-like as well as have some interface functions that aren’t provided by the standard KM dialogs. Specifically:A El-Capitan-style alert box with multiple buttonsA multiple checkboxes dialog to select multiple items from a pick-listA type-ahead box to select from a pick-list (like a combo-box)This requires a little bit of extra installation work. You’ll need to move the html-elements folder to ~/Library/Application Support/Keyboard Maestro. If you want it somewhere else, you can edit the variable in the macros themselves.Download: Fancy HTML Prompts.zip (zip, 240312 bytes)</summary></entry><entry><title type="html">It Gets Used - The Benefits of Integrated Marketing Automation</title><link href="https://nik.me/it-gets-used-the-benefits-of-integrated/" rel="alternate" type="text/html" title="It Gets Used - The Benefits of Integrated Marketing Automation" /><published>2016-03-30T16:59:31+00:00</published><updated>2016-03-30T16:59:31+00:00</updated><id>https://nik.me/it-gets-used-the-benefits-of-integrated</id><content type="html" xml:base="https://nik.me/it-gets-used-the-benefits-of-integrated/">&lt;a href=&quot;https://www.bluemodus.com/bluemodus-blog/march-2016/it-gets-used-the-benefits-of-integrated-marketin&quot;&gt;It Gets Used - The Benefits of Integrated Marketing Automation&lt;/a&gt;&lt;br/&gt;&lt;p&gt;I know marketing automation’s a little off the usual track of my blog, but I thought I’d share my latest blog post on BlueModus.&lt;/p&gt;</content><author><name>Nik</name></author><summary type="html">It Gets Used - The Benefits of Integrated Marketing AutomationI know marketing automation’s a little off the usual track of my blog, but I thought I’d share my latest blog post on BlueModus.</summary></entry></feed>