Subscribe to masimplo.com

Stay up to date! Get all the latest & greatest posts delivered straight to your inbox

masimplo.com

"Love many things, for therein lies the true strength, and whosoever loves much performs much, and can accomplish much, and what is done in love is done well." - Van Gogh

Portfolio Ticker four months on — ROI/yr, year returns, and a real order log cover image
Tools,  Technology,  Code,  Firebase,  Personal

Portfolio Ticker four months on — ROI/yr, year returns, and a real order log

Living with Portfolio Ticker exposed the gaps — annualized ROI, calendar-year returns, and what happens when you sell. Here is what I added.

CI was red for six weeks — and the site never noticed cover image
Testing,  Tools,  Code

CI was red for six weeks — and the site never noticed

My blog's CI has failed on every single push since June 20th. The site kept deploying fine the whole time, which is exactly the problem.

Owning an EV — the parking space and the bill nobody mentioned cover image
Personal,  Technology,  Opinions

Owning an EV — the parking space and the bill nobody mentioned

Everyone selling you an EV talks about the driving. Nobody mentions the parking space it requires, or what it does to your electricity bill.

Building a second brain in Obsidian — and telling my AI agents what not to write there cover image
AI,  Tools,  Tips

Building a second brain in Obsidian — and telling my AI agents what not to write there

I finally built an Obsidian second brain that stuck — by writing down what my AI agents are and aren't allowed to put in it.

The Fellow Aiden was the most fun I've had making coffee — I still might not buy it again cover image
Technology,  Personal,  Opinions

The Fellow Aiden was the most fun I've had making coffee — I still might not buy it again

The Fellow Aiden is the most hyped filter coffee maker on the market. After a few weeks with one, the coffee is good — just not 10x-the-price good.

One AGENTS.md for every coding agent — stop maintaining three rule files cover image
AI,  Tools,  Tips

One AGENTS.md for every coding agent — stop maintaining three rule files

Put shared project rules in AGENTS.md, keep a thin CLAUDE.md that imports it, and leave Skills for verbs — so Cursor, Claude Code, and Codex stop drifting apart.

Let the big model write the manual — using Fable 5 to make smaller models better cover image
AI,  Code,  Tools

Let the big model write the manual — using Fable 5 to make smaller models better

I stopped pointing the frontier model at my backlog and started using it to write the Skills and guidelines my cheaper models read.

The drink I make that actually works cover image
Hobbies,  Lifehacks

The drink I make that actually works

Fresh ginger, lemon juice, and honey is already a drink worth making. Then I started fermenting it, and now I cannot go back.

Guardrails beat guidelines — how to keep AI-generated code honest cover image
AI,  Code,  Testing,  Opinions

Guardrails beat guidelines — how to keep AI-generated code honest

You cannot prompt AI-generated code into being reliable. What works is what always worked with new hires — guardrails that say no.

Portfolio Ticker — a tiny monitor for investments scattered across brokers cover image
Technology,  Code,  Firebase,  Tools,  Personal

Portfolio Ticker — a tiny monitor for investments scattered across brokers

I had stocks and ETFs across three platforms and no single place to see them. So I built one, and left it open for anyone else to use.

Daikin weather compensation — 21% less heat from one offset cover image
Smart Home,  Tips,  Hobbies

Daikin weather compensation — 21% less heat from one offset

Installer left the weather-compensation offset at +5. Dropping it to 0 cut heat-pump energy about 21% — same house, same week of March, Shelly numbers.

Three similar Ionic apps, one Nx monorepo, and a lot of AI-assisted glue work cover image
Ionic,  Technology,  AI,  Code,  Personal

Three similar Ionic apps, one Nx monorepo, and a lot of AI-assisted glue work

How we merged three Ionic/Angular/Capacitor codebases into a single Nx workspace so a small team could stop maintaining the same code in three places.

Using Claude Code's parallel agents to collaborate on a feature cover image
AI,  Code,  Tools

Using Claude Code's parallel agents to collaborate on a feature

The single-agent model has a ceiling. Claude Code's parallel agents let you split a feature into independent pieces and work like a focused team.

Training juniors in the AI era — judgment, struggle, and why the field still needs new data cover image
Opinions,  Code,  Technology

Training juniors in the AI era — judgment, struggle, and why the field still needs new data

AI makes junior developers look productive on week two. If we train them for speed alone, we hollow out the next decade of engineering judgment.

Vibe Coding: An Honest Take After Three Years of AI-Assisted Development cover image
Technology,  AI,  Code,  Opinions

Vibe Coding: An Honest Take After Three Years of AI-Assisted Development

Three years of AI-assisted development later, vibe coding is real. The thinking is yours, the judgment is yours — the typing was never the point.

Home Assistant and the local-first smart home cover image
Smart Home,  Technology,  Hobbies

Home Assistant and the local-first smart home

Smart home products love to sell you convenience. What they do not mention is that most of that convenience runs through someone else's server.

The Voron build was hard — owning one is the real project cover image
3D Printing,  Hobbies

The Voron build was hard — owning one is the real project

Finishing the Voron build feels like crossing a finish line. That high is real. It is also misleading — the real project is what comes after.

Keeping an old car in great shape when nobody else sweats the details cover image
Tips,  Hobbies

Keeping an old car in great shape when nobody else sweats the details

Old does not mean good enough. What happened when I stopped trusting other people's checklists and kept my Astra OPC running like clockwork.

AI code review is the bottleneck — writing got cheap cover image
AI,  Opinions,  Code

AI code review is the bottleneck — writing got cheap

Agents fill the merge queue faster than humans can read. The constraint moved from typing to verification — and most teams still review like nothing changed.

The week coding assistants stopped pretending to be autocomplete cover image
Technology,  AI,  Code

The week coding assistants stopped pretending to be autocomplete

Claude 3.7 Sonnet was the first time I caught myself delegating context, not lines. AI coding assistants stopped pretending to be autocomplete.

DeepSeek R1 and the week the pricing story broke cover image
Technology,  AI,  Opinions

DeepSeek R1 and the week the pricing story broke

When DeepSeek dropped R1, my first reaction was not hype — it was spreadsheet panic. The comfortable pricing story suddenly had a counterexample.

Zigbee first, Matter later — radios for a local Home Assistant house cover image
Smart Home,  Technology,  Hobbies

Zigbee first, Matter later — radios for a local Home Assistant house

My house is Wi‑Fi and Shelly end to end. When I finally add battery sensors, I still plan Zigbee first — and Matter as a buying filter, not a rip-and-replace.

Building a smart HVAC system from scratch cover image
Smart Home,  Hobbies,  Technology

Building a smart HVAC system from scratch

When you build your own house you get to make all the decisions. That sounds great until you realize you also have to live with all of them.

Finding an appropriate WAF might be harder than it looks cover image
Security,  Technology

Finding an appropriate WAF might be harder than it looks

Shopping for a Web Application Firewall on a small budget is rough — opaque pricing, call-for-quote tiers, and GDPR clashes with CDN offerings.

Ionic Angular standalone components — migrating 500+ components cover image
Ionic,  Code

Ionic Angular standalone components — migrating 500+ components

How I migrated an Ionic Angular app with 500+ components to standalone using the official schematic, plus the routing and provider fixes that still needed a human.

Help the Helpdesk! Send Info. cover image
Tips

Help the Helpdesk! Send Info.

A small trick that makes app support better — prefill your mailto contact link with device and user info so the helpdesk skips the back-and-forth.

Bing's great comeback cover image
Technology,  AI

Bing's great comeback

Microsoft wired ChatGPT into Bing and used the waitlist to push Bing onto millions of devices — pure marketing genius in my book.

3D printing resources cover image
3D Printing

3D printing resources

This is just a list of links related to 3D printing, mainly here for my own reference, but pretty sure you might find something useful in them also.

Voron bed mesh looks warped — check the gantry first cover image
3D Printing,  Hobbies

Voron bed mesh looks warped — check the gantry first

My Voron bed mesh jumped to 0.32mm and I assumed a warped MIC-6 plate. Calipers said the gantry was out of parallel — fixed without replacing the bed.

Software security is a culture not a calendar event cover image
Security,  Opinions

Software security is a culture not a calendar event

Treating software security as an occasional audit is a mistake — small companies compete by making security part of every decision they take.

In the Era of ChatGPT and friends cover image
Technology,  AI

In the Era of ChatGPT and friends

If you can no longer tell whether ChatGPT or a human wrote a piece of text, what does that do to authenticity and trust in what we read?

Manage model collections in JavaScript without leaking Array cover image
Javascript,  Code

Manage model collections in JavaScript without leaking Array

Expose a raw array, wrap mutations in methods, or extend Array — three patterns for typed collections that block duplicates and invalid data.

Set Firebase custom user claims with a Cloud Function cover image
Firebase,  Code

Set Firebase custom user claims with a Cloud Function

Callable Cloud Function that calls setCustomUserClaims, plus Firestore rules and client checks for a moderator claim.

Batch resize images on Mac with Preview cover image
Tips,  Tools

Batch resize images on Mac with Preview

Open a batch in Preview, Select All, Adjust Size — no third-party app required. Optional ImageOptim pass for web-ready files.

Building my own 3D printer cover image
3D Printing,  Hobbies

Building my own 3D printer

How I went from a modded Ender 3 Pro to building a Voron from 150 separate part orders, and why DIY 3D printing is such a rewarding hobby.

Remove laptop sticker residue with baking soda and rubbing alcohol cover image
Lifehacks,  Tips

Remove laptop sticker residue with baking soda and rubbing alcohol

Baking soda plus rubbing alcohol removes laptop sticker residue in seconds after nail polish remover, vinegar, and alcohol alone all failed.

Measure real-user web performance with the Performance API cover image
Performance,  Code

Measure real-user web performance with the Performance API

Use performance.mark, performance.measure, and PerformanceObserver to see how slow code actually is on users' devices — not just in the lab.

Github Source cover image
Source

Github Source

Where to find this project on GitHub.

Enable git rerere so rebase conflicts resolve themselves cover image
Tips,  Tools

Enable git rerere so rebase conflicts resolve themselves

Turn on git rerere and git remembers how you resolved a conflict — repeated rebases of a feature branch stop asking you to fix the same thing twice.

Async/await retry with timeout in Node.js cover image
Code,  Tips

Async/await retry with timeout in Node.js

A small Express middleware that wraps async handlers with timeout and retry for flaky database calls — cleaner than chaining promise-retry.

Ionic environment config with NODE_ENV and Angular DI cover image
Ionic,  Code,  Tips

Ionic environment config with NODE_ENV and Angular DI

Typed dev/prod config via OpaqueToken and a NODE_ENV factory so Ionic2 builds pick the right API keys at compile time.

Mock Ionic ModalController to test onDidDismiss cover image
Ionic,  Testing,  Code

Mock Ionic ModalController to test onDidDismiss

A reusable PresentableControllerMock so unit tests can dismiss modals, alerts, and toasts and assert the page callback.

Adding type safety to Immutable.js with Typescript string literals and keyof cover image
Code

Adding type safety to Immutable.js with Typescript string literals and keyof

How I use TypeScript string literals and keyof to make Immutable.js get calls type safe, so property renames break at compile time instead of runtime.

Test RxJS interval and debounceTime without waiting real seconds cover image
Testing,  Code

Test RxJS interval and debounceTime without waiting real seconds

Angular fakeAsync and tick beat setTimeout waits and jasmine.clock for time-based RxJS5 observables in unit tests.

What's wrong with StackOverflow cover image
Opinions

What's wrong with StackOverflow

Why I stopped answering questions on StackOverflow, where low-effort posts and point farming are eroding a great platform.

Delete git tags in bulk — remote and local one-liners cover image
Tips,  Tools

Delete git tags in bulk — remote and local one-liners

How to delete git tags matching a pattern from origin and your local clone in one shot, using git ls-remote, awk, and xargs.

Sync Cordova config.xml version with npm version cover image
Bash,  Tips,  Ionic

Sync Cordova config.xml version with npm version

Hook npm version so Cordova config.xml gets the same semver as package.json in the same commit and tag.

Install and switch Node.js versions with nvm cover image
Tools,  Tips

Install and switch Node.js versions with nvm

NVM is still the easiest way to install Node.js, switch versions instantly, and migrate global packages when you upgrade.

Remove sensitive data from git history with BFG cover image
Security,  Tools,  Tips

Remove sensitive data from git history with BFG

Accidentally pushed an API key to GitHub? Scrub it from git history with BFG Repo-Cleaner, then force-push — reverting the commit is not enough.

Ionic VirtualScroll with custom components — wrap in a div cover image
Ionic,  Tips

Ionic VirtualScroll with custom components — wrap in a div

Ionic2 VirtualScroll would not render custom item components — wrap the component in a plain div with *virtualItem until the framework catches up.

Add highlight.js to Ghost with Code Injection cover image
Blogging,  Tips

Add highlight.js to Ghost with Code Injection

Paste highlight.js CSS and script into Ghost Admin Code Injection — no theme file edits required for syntax highlighting.

Custom TeamCity build agent from a Dockerfile cover image
Docker,  Tools

Custom TeamCity build agent from a Dockerfile

Build a reproducible TeamCity agent image with Node and gulp from a Dockerfile instead of docker commit on a hand-tweaked container.

List globally installed npm packages with versions cover image
Tips,  Tools

List globally installed npm packages with versions

One command lists every globally installed npm package and its version — useful when migrating globals to yarn or a new machine.

Run Ghost in Docker behind an nginx reverse proxy cover image
Docker,  Blogging,  Tips

Run Ghost in Docker behind an nginx reverse proxy

docker-compose for Ghost plus a custom nginx proxy image — full compose file, nginx.conf, and Dockerfile.

Welcome to Ghost cover image
Docker

Welcome to Ghost

A fresh start for my blog on Ghost, a minimal nodejs blogging platform, running inside a docker container behind an nginx proxy.

Waiting for progress cover image
Code

Waiting for progress

A simple static event class that lets any deeply nested code update the main form's progressbar without passing references around.

Practical CSS3 tables with rounded corners - RedTeamDesign cover image
Web Design,  CSS

Practical CSS3 tables with rounded corners - RedTeamDesign

I came across a red-team-design.com article showing a simple way to build CSS3 tables with rounded corners and hover effects, so I am sharing it here.

A picture is a thousand words. GreenShot cover image
Tools

A picture is a thousand words. GreenShot

After years on SnagIt I switched to GreenShot, a free open-source screenshot tool with handy capture hotkeys and a built-in editor.

Annoying online salesrobot cover image
Online Shopping

Annoying online salesrobot

Amazon spends millions on product recommendations, yet its cross-selling emails still can't match a good in-store saleswoman.

Breaking promises...and asking santa for internet access. cover image
Blogging,  Personal

Breaking promises...and asking santa for internet access.

Six months of blog silence, two months without an internet connection at my new home, and a rant about paying for service I never got.

Google Apps forwarding cover image
Tips

Google Apps forwarding

Google Apps has no traditional email forwarders, but with a few steps you can configure its Groups feature to forward mail to any addresses you like.

Android blogging cover image
Blogging

Android blogging

I installed the WordPress app on my Android phone so I can manage posts, pages, comments and stats, and I even wrote this post with it.

Entity Framework Proxy GetType() mess cover image
.Net

Entity Framework Proxy GetType() mess

Entity Framework returns dynamic proxies whose GetType() breaks generic repositories, so I use ObjectContext.GetObjectType to get the real entity type.

Hello world cover image
Blogging

Hello world

I have started and abandoned several blogs before, so this is another attempt to write about my studies, my work and my hobbies.