Getting an .edu.ph Domain and Setting Up Google Workspace Education for a Philippine Institution Registering an .edu.ph domain through PHNET requires government recognition papers and an authorized letter on school letterhead. Then I accidentally claimed the domain under a Google Workspace Business account and had to contact support to undo it.
Compliance Google Workspace Infrastructure
Read more PostHog and Upstash Redis on a Multi-Role Next.js App What I actually got from PostHog beyond page views, and why Upstash Redis made more sense than self-hosted Redis for edge rate limiting.
Layered Security in Next.js Middleware Before Auth Runs How I structured request filtering in middleware to block path traversal, SQL injection probes, and rate limit abuse without touching the database.
Building RBAC for Six User Roles in One Next.js App How I structured role-based access across middleware route guards, server action checks, and UI rendering without maintaining six separate permission tables.
Why I Stopped Using Prisma for High-Volume Production Workloads What failed at 20K to 30K record uploads, what changed, and why raw MySQL2 became the better production path.
MySQL2 Connection Pooling: What Happens Without It at Scale Why individual connections fail under concurrent load and how a proper pool configuration fixed it.
Fixing N+1 Queries in a Live Multi-Store System Found 101 queries per page load on a report used every morning. How I brought it down to one.
Bulk INSERT and UPDATE in Node.js Without an ORM Processing 20K records one row at a time is a different problem than processing them in batches.
How I Chose Composite Indexes on a 500K-Record System Index selection based on actual query patterns, not guesswork. EXPLAIN first, add second.
Building a 5-Phase CSV Upload Pipeline That Handles 30K Rows Validation, deduplication, batch fetching, bulk writes, and inventory sync in one transaction.
Replacing Array.find() with Map for O(1) Lookups in Data Pipelines What O(n2) looks like at 20K records and what one Map object does to fix it.
JavaScript Performance Data Structures
Read more Keeping TypeScript Type Safety When You Drop the ORM How to use Prisma-generated types and RowDataPacket interfaces with raw MySQL2 queries.
TypeScript MySQL2 Developer Experience
Read more From 2-Minute Reports to 30-Second Queries in Production A practical optimization pass using indexes, JOIN refactors, and batch queries on a live multi-brand system.
One Codebase, 8 Brands, 100+ Stores: How Configuration Replaced Forking The client wanted 7 more brands on the same system. The obvious move was 8 forks. Here's why I didn't β and what I hit instead: an ORM that failed silently at 20K records, a server running at 25% CPU, and a manual Excel workflow costing the operations team weeks every month.
Architecture Multi-tenant MySQL2 PM2 Node.js Performance On-Premise Scalability
Read more PM2 Clustering in Practice: 4x Throughput on the Same Hardware How we moved from single-process bottlenecks to stable multi-core utilization with better uptime.
Batch Processing That Cut Memory Use by 16x A chunked upload pipeline that prevented crashes and made concurrent uploads reliable.
Automating Stock Reconciliation Across 4 Tables How we replaced manual weekly reconciliation with transactional updates and audit-safe sync logic.
React Query Caching Strategy for Busy Business Dashboards Practical caching rules that reduced redundant requests and improved day-to-day dashboard responsiveness.
What On-Premise Deployment Taught Me About Real Constraints No cloud shortcuts, no managed database. Just hard limits, predictable behavior, and careful operations.
Designing One Dashboard for Executives, Managers, and Warehouse Teams Role-based data access and workflow design that kept one interface useful across five different teams.
How to Build Business Systems That Actually Save Time A delivery approach focused on bottlenecks, adoption, and measurable outcomes instead of feature count.