Blog
Technical
Engineering notes from the team — TypeScript patterns, monorepo trade-offs, infrastructure decisions and the build tooling behind Procaptcha.

How to Stop PHP Form Spam (Without a Plugin)
If your PHP mail script is being abused by bots, stop the bot before mail() runs — server-side CAPTCHA verification in a few lines of PHP, via Procaptcha.

Chris Taylor
Faking browsers is easy — but not at scale
131,819 residential US IPs threw 1.4M brute-force attempts at one mobile-only customer in 30 days — all collapsing onto a handful of fingerprints.

Chris Taylor

How to Add CAPTCHA to Fastly CDN
Learn how to integrate Procaptcha with Fastly CDN to protect your website from bot attacks while maintaining performance and user privacy.

Chris Taylor

We suffered MongooseJS so you don't have to
We investigate how MongooseJS's type safety can silently add bugs to your code base.

George Oastler

We cut our Mongo DB costs by 90% by moving to Hetzner
We moved MongoDB Atlas off AWS and onto self-hosted Hetzner boxes — 90% cost cut, no performance loss. Here's the setup, the Ansible, and what broke.

Chris Taylor

Reactive Frameworks Cheatsheet - React, Vue, Svelte and Angular

Maxim Akimov

PHP Views Package - Templating Made Easy with Blade and Model-Driven Approach

Maxim Akimov

Streamlining Releases: Building Scalable CICD Pipelines with Changesets
Overcome common challenges and scale your CICD pipelines for seamless versioning, releases and deployments.

George Oastler

Independent vs Locked Versioning in a Workspace
Locked vs independent versioning in a monorepo workspace — the tradeoffs on release cadence, dependency drift and CI overhead, and which one fits your team.

George Oastler

Mastering Versioning: A Guide to Software Stability
Semver rules, dependency traps and the pitfalls that break stable builds — how we manage versioning at Prosopo without wrecking downstream consumers.

George Oastler

Monorepo vs Multirepo Architecture: How to Decide?
Monorepo vs multirepo — tradeoffs on tooling, CI cost, dependency drift and team autonomy. Which one actually fits your project, and when to switch.

George Oastler

How to Test Your Ansible Playbooks Locally
Testing your Ansible playbooks locally can save you time and effort. Here are some tips to help you get started.

Chris Taylor

tsx vs ts-node: Time to Drop ts-node for tsx
tsx vs ts-node compared: why tsx runs TypeScript faster than ts-node, and how to migrate your Node.js scripts away from ts-node today.

Chris Taylor

actions/cache@v3 restore: GitHub Actions Cache Fix
Fix GitHub Actions caching with actions/cache@v3 and actions/cache/restore: share caches across branches and evict old caches faster.

George Oastler

TypeScript: Branded Types 🔧
How to brand TypeScript types for norminal typing, providing an automated and easy-to-use way of making a type nominal.

George Oastler

Using Vite To Rebuild Local Dependencies in an NPM Workspace
Vite ignores local workspace packages because they sit outside its module graph — the config trick that forces Vite to rebuild sibling npm packages.

Chris Taylor

Vite: How to handle `.node` files
Vite can't bundle `.node` native binaries — it treats them as raw JS and blows up. Our custom rollup plugin that copies `.node` files through the build.

George Oastler

TypeScript: Mapped Type Magic 🪄
TypeScript mapped types can make Cat === Dog — a weird paradox. How to brand identical structural types so the compiler can tell them apart.

George Oastler

How to deploy Procaptcha on your website or app
How to switch from Google's reCAPTCHA to Prosopo Procaptcha and protect your website or app from bots for free.

Chris Taylor