56,966 blogs · [ { "id": "01a087be-d053-712a-b7e3-9a955c31982e", "title": "Qwen3.8-27B at Q4 on One RTX 4090 vs Claude Opus", "url": "https://www.pedroalonso.net/blog/local-qwen-vs-opus-booking-app/", "published_at": "2026-08-24T09:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8c9a892a5", "title": "Running MiniMax H3 Locally on One RTX 4090: A Storybook Becomes a Film", "url": "https://www.pedroalonso.net/blog/minimax-h3-local-rtx-4090/", "published_at": "2026-08-09T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8ca8f821b", "title": "One Day of LLM Agent Observability: Five Production Bugs, Three JSONL Files", "url": "https://www.pedroalonso.net/blog/llm-agent-tracing-case-study/", "published_at": "2026-07-30T18:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8ca957a7c", "title": "Logging Email to a CRM: What AI Actually Changed (and What It Didn't)", "url": "https://www.pedroalonso.net/blog/email-crm-intake-local-llm/", "published_at": "2026-07-24T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cb4cae0c", "title": "Style Prompts Without the Artist's Name: Three Ways It Breaks, and the Fixes", "url": "https://www.pedroalonso.net/blog/style-prompts-without-artist-names/", "published_at": "2026-07-20T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cc3ed3f6", "title": "I trained a 3B model to rival Claude Opus at text-to-SQL on one GPU. Here is exactly where that holds, and where it breaks", "url": "https://www.pedroalonso.net/blog/rl-small-model-text-to-sql/", "published_at": "2026-07-10T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cd1e9aa9", "title": "Do You Need a Glean? I Self-Hosted Onyx and Rebuilt It on Postgres — Same Corpus, Same Local LLM", "url": "https://www.pedroalonso.net/blog/onyx-vs-postgres-rag/", "published_at": "2026-07-08T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cd3c35ea", "title": "Durable LLM Agent Workflows on SQLite — and the Exact Line Where You Graduate to Temporal", "url": "https://www.pedroalonso.net/blog/durable-llm-workflows-sqlite/", "published_at": "2026-07-01T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cd9e1b6b", "title": "Case Study: Reframe — Building an AI Shopify App Solo, From First Commit to Paying Merchants", "url": "https://www.pedroalonso.net/blog/reframe-ai-shopify-app-case-study/", "published_at": "2026-06-29T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8ce038e4d", "title": "Don't Make an LLM Find Your At-Risk Customers. Make It Explain Them.", "url": "https://www.pedroalonso.net/blog/spotting-at-risk-customers/", "published_at": "2026-06-29T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8ce61eee2", "title": "Your Customer List Is Full of Duplicates. Here's How to Find Them in Postgres.", "url": "https://www.pedroalonso.net/blog/find-duplicate-customers-postgres/", "published_at": "2026-06-28T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8ce6b6e40", "title": "Which Patients Will Ghost? Predicting Dental No-Shows Without the AI Hype", "url": "https://www.pedroalonso.net/blog/predicting-appointment-no-shows/", "published_at": "2026-06-22T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cf3b00dc", "title": "How Much of Your LLM Bill Is the Same Question Twice? I Measured It.", "url": "https://www.pedroalonso.net/blog/semantic-caching-postgres/", "published_at": "2026-06-19T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cf998589", "title": "When Does a Knowledge Graph Beat Vector Search — and When Do You Actually Need Neo4j?", "url": "https://www.pedroalonso.net/blog/graphrag-vs-vector-postgres/", "published_at": "2026-06-17T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8cfcf3f27", "title": "I Built a Recommendation Engine in Pure Postgres. The Embeddings Lost to ORDER BY count(*).", "url": "https://www.pedroalonso.net/blog/postgres-recommendation-engine/", "published_at": "2026-06-16T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d022a36c", "title": "Evaluating and Monitoring LLM Workflows in Production: What to Use and How", "url": "https://www.pedroalonso.net/blog/llm-evaluation-monitoring-production/", "published_at": "2026-06-15T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d05f1eb2", "title": "Geospatial RAG on Postgres: One Query for \"Where\" and \"What Kind\"", "url": "https://www.pedroalonso.net/blog/geospatial-rag-postgres/", "published_at": "2026-06-14T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d0968caf", "title": "Every Supplier Invoice in Your Accounting System, Same Day", "url": "https://www.pedroalonso.net/blog/supplier-invoices-same-day/", "published_at": "2026-06-11T12:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d14ddd70", "title": "Invoice Extraction Is Solved. The Pipeline Around It Isn't.", "url": "https://www.pedroalonso.net/blog/ai-invoice-pipeline-pdf-to-database/", "published_at": "2026-06-11T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d24bacba", "title": "Automating E-Commerce Photography with AI", "url": "https://www.pedroalonso.net/blog/automating-ecommerce-photography/", "published_at": "2026-06-11T09:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d32ae9dc", "title": "Building a Support Copilot with RAG on Postgres (No Vector Database)", "url": "https://www.pedroalonso.net/blog/rag-on-postgres-support-copilot/", "published_at": "2026-06-10T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d3dcbe14", "title": "Speculative Decoding on a Single RTX 4090: MTP Nearly Tripled Qwen3.6-27B", "url": "https://www.pedroalonso.net/blog/qwen-mtp-speculative-decoding-4090/", "published_at": "2026-06-09T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d4873d28", "title": "My Remote AI Dev Workflow: Claude Code + tmux + 4090 Server From Anywhere", "url": "https://www.pedroalonso.net/blog/remote-ai-dev-workflow-claude-code-tmux-4090/", "published_at": "2026-03-20T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d496fdaa", "title": "BM25 Search in PostgreSQL: The Missing Piece for Hybrid Search", "url": "https://www.pedroalonso.net/blog/postgres-bm25-search/", "published_at": "2026-02-15T22:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d575f7c8", "title": "LangChain Evolution Part 4: The 12-Factor Agent Methodology", "url": "https://www.pedroalonso.net/blog/langchain-evolution-part-4/", "published_at": "2025-11-18T00:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d5ded9fc", "title": "Building My AI Home Lab: From Laptop to Dedicated Server", "url": "https://www.pedroalonso.net/blog/ai-home-lab-setup/", "published_at": "2025-11-12T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d644da00", "title": "Multi-Tenant Search in PostgreSQL with Row-Level Security", "url": "https://www.pedroalonso.net/blog/postgres-multi-tenant-search/", "published_at": "2025-11-04T22:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d6b57aa1", "title": "PostgreSQL LISTEN/NOTIFY: Real-Time Without the Message Broker", "url": "https://www.pedroalonso.net/blog/postgres-listen-notify-real-time/", "published_at": "2025-11-03T22:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d6c3a051", "title": "Next.js Server Actions: The Complete Guide", "url": "https://www.pedroalonso.net/blog/nextjs-server-actions-complete-guide/", "published_at": "2025-11-01T22:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d6ea3d99", "title": "I Let GitHub Copilot Remotely Debug My Live Ubuntu Server", "url": "https://www.pedroalonso.net/blog/ai-ssh-access-to-my-server/", "published_at": "2025-11-01T10:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d7d055b1", "title": "LangChain Evolution Part 3: Production-Ready Agentic Systems", "url": "https://www.pedroalonso.net/blog/langchain-evolution-part-3/", "published_at": "2025-10-22T00:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d7e754bf", "title": "LangChain Evolution Part 2: From Hardcoded Workflows to Dynamic Graphs", "url": "https://www.pedroalonso.net/blog/langchain-evolution-part-2/", "published_at": "2025-10-21T00:00:00+00:00" }, { "id": "01a087be-d057-73c0-80dc-79f8d83b37ab", "title": "LangChain Evolution Part 1: From Monolithic Prompts to Intelligent Agents", "url": "https://www.pedroalonso.net/blog/langchain-evolution-part-1/", "published_at": "2025-10-20T00:00:00+00:00" }, { "id": "01a087be-d058-7184-9596-35d47e539620", "title": "Building Your AI-Powered Sales Engine Part 2: From Lead Generation to Client Acquisition", "url": "https://www.pedroalonso.net/blog/ai-automation-business-for-developers-part-2/", "published_at": "2025-10-17T23:00:00+00:00" }, { "id": "01a087be-d058-7184-9596-35d47ea659c5", "title": "AI Automation Business for Developers - Part 1", "url": "https://www.pedroalonso.net/blog/ai-automation-business-for-developers-part-1/", "published_at": "2025-10-17T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0890215760", "title": "Real-Time Notifications with Server-Sent Events (SSE) in Next.js", "url": "https://www.pedroalonso.net/blog/sse-nextjs-real-time-notifications/", "published_at": "2025-10-15T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0890d53398", "title": "Stripe Payment Links and Customer Portal in Next.js 15", "url": "https://www.pedroalonso.net/blog/stripe-payment-links-nextjs/", "published_at": "2025-10-15T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0891072702", "title": "Stripe + Next.js 15: The Complete 2025 Guide", "url": "https://www.pedroalonso.net/blog/stripe-nextjs-complete-guide-2025/", "published_at": "2025-10-12T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0891e867e2", "title": "Redis Queues and Pub/Sub in Next.js - A Practical Guide", "url": "https://www.pedroalonso.net/blog/redis-queues-pubsub-nextjs/", "published_at": "2025-10-10T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0892dc812a", "title": "WebSockets with Next.js Part 4: Going Native - Ditching Socket.IO", "url": "https://www.pedroalonso.net/blog/websockets-nextjs-part-4/", "published_at": "2025-10-10T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08931b0ab0", "title": "Implementing Pre-paid Usage Billing with Next.js and Stripe", "url": "https://www.pedroalonso.net/blog/stripe-usage-credit-billing/", "published_at": "2025-04-12T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08935f011a", "title": "Dokku Migrations: Introducing the Open Source Dokku Migration Tool", "url": "https://www.pedroalonso.net/blog/dokku_migration_cli/", "published_at": "2025-04-07T10:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0893ec2cf2", "title": "Building Practical AI Agents: From Tools to Workflows", "url": "https://www.pedroalonso.net/blog/practica-ai-agents-tools-to-workflows/", "published_at": "2025-02-12T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0893f54313", "title": "Extending LLM Capabilities with Custom Tools: Beyond the Knowledge Cutoff", "url": "https://www.pedroalonso.net/blog/extending-llm-custom-tools/", "published_at": "2025-02-06T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08948b74a1", "title": "Building a Self-Healing LLM JSON Processor with Zod and Ollama (Deepseek 8b)", "url": "https://www.pedroalonso.net/blog/llm-json-processor-zod-claude/", "published_at": "2025-02-02T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089527b5e9", "title": "Background Processing in Next.js Part 1", "url": "https://www.pedroalonso.net/blog/background-jobs-nextjs-part-1/", "published_at": "2025-01-02T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0895e2c326", "title": "Advanced Background Processing in Next.js Part 2", "url": "https://www.pedroalonso.net/blog/background-jobs-nextjs-part-2/", "published_at": "2025-01-02T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089615466d", "title": "RAG Systems Deep Dive Part 3: Advanced Features and Performance Optimization", "url": "https://www.pedroalonso.net/blog/part-3-rag-langchain-advanced/", "published_at": "2024-11-26T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0896fa1326", "title": "RAG Systems Deep Dive Part 2: Practical Implementation with LangChain", "url": "https://www.pedroalonso.net/blog/part-2-rag-langchain-js/", "published_at": "2024-11-25T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0897720066", "title": "Next.js APIs with tRPC: A Developer's Guide to End-to-End Type Safety", "url": "https://www.pedroalonso.net/blog/trpc-nextjs-api-integration/", "published_at": "2024-11-13T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08981b701b", "title": "RAG Systems Deep Dive Part 1: Core Concepts and Architecture", "url": "https://www.pedroalonso.net/blog/part-1-rag-intro/", "published_at": "2024-11-12T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08982bac9d", "title": "Stripe Webhooks: Solving Race Conditions and Building a Robust Credit Management System", "url": "https://www.pedroalonso.net/blog/stripe-webhooks-deep-dive/", "published_at": "2024-11-06T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0898a13ee0", "title": "Intro to Ollama: Your Personal AI Model Tool", "url": "https://www.pedroalonso.net/blog/ollama_part_1_intro/", "published_at": "2024-10-28T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0898aca53a", "title": "Security Best Practices: Learning from Real-World Incidents", "url": "https://www.pedroalonso.net/blog/security-best-practices/", "published_at": "2024-10-26T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c08999007ca", "title": "Local AI Assistance with Continue and Ollama for VS Code", "url": "https://www.pedroalonso.net/blog/local-ai-continue-ollama/", "published_at": "2024-10-15T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c0899a112ca", "title": "Stripe Subscriptions in a Next.js Application", "url": "https://www.pedroalonso.net/blog/stripe-subscriptions-nextjs/", "published_at": "2024-10-14T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089a1a8cb5", "title": "LLM Prompting Techniques for Developers", "url": "https://www.pedroalonso.net/blog/llm-prompting-techniques-developers/", "published_at": "2024-09-09T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089a2fedd3", "title": "WebSockets with Next.js Part 3: Advanced Concepts and Best Practices", "url": "https://www.pedroalonso.net/blog/websockets-nextjs-part-3/", "published_at": "2024-09-06T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089afa7dd3", "title": "Asynchronous JavaScript: Promises, Async/Await, and Error Handling", "url": "https://www.pedroalonso.net/blog/async-await-javascript/", "published_at": "2024-09-05T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089b11c37a", "title": "From Idea to MVP: Building FastForward IQ with Next.js", "url": "https://www.pedroalonso.net/blog/building-fastforwardiq-youtube-summarizer/", "published_at": "2024-09-04T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089b5bc21a", "title": "WebSockets with Next.js Part 2: Real-Time Chat", "url": "https://www.pedroalonso.net/blog/websockets-nextjs-part-2/", "published_at": "2024-09-04T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089c21a45c", "title": "Zustand: Simplifying State Management in React E-commerce Applications", "url": "https://www.pedroalonso.net/blog/zustand-intro/", "published_at": "2024-09-03T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089d0bcef3", "title": "WebSockets with Next.js Part 1: Basics and Setup", "url": "https://www.pedroalonso.net/blog/websockets-nextjs-part-1/", "published_at": "2024-09-02T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089d263951", "title": "Advanced Search Techniques with pgvector and Geospatial Search", "url": "https://www.pedroalonso.net/blog/pgvector-postgres-search/", "published_at": "2024-08-23T22:00:00+00:00" }, { "id": "01a087be-d059-71e7-983b-1c089db854d6", "title": "Full-Text Search with PostgreSQL and Prisma", "url": "https://www.pedroalonso.net/blog/postgres-full-text-search/", "published_at": "2024-08-21T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e3302c133", "title": "Deploying Nextjs on Your Own VPS using Dokku", "url": "https://www.pedroalonso.net/blog/deploying-nextjs-vps-using-dokku/", "published_at": "2024-08-19T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e337c4d5e", "title": "Smart Login in Next.js with NextAuth.js", "url": "https://www.pedroalonso.net/blog/smart-login-nextjs-with-nextauth/", "published_at": "2024-07-12T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e33b76d78", "title": "Authentication in Next.js 14 with NextAuth.js", "url": "https://www.pedroalonso.net/blog/authentication-nextjs-with-nextauth/", "published_at": "2024-06-16T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e33d8eb7c", "title": "Building a Shopping Cart with React and Local Storage", "url": "https://www.pedroalonso.net/blog/shopping-cart-react-localstorage/", "published_at": "2024-06-11T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e3478b5e4", "title": "Mastering JavaScript Array Methods: Map, Filter, Reduce, and More", "url": "https://www.pedroalonso.net/blog/js-array-methods/", "published_at": "2024-03-28T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e35580a3e", "title": "Stripe Checkout and Webhook in a Next.js Application", "url": "https://www.pedroalonso.net/blog/stripe-integration-nextjs/", "published_at": "2024-03-27T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e363d4df7", "title": "Test-Driven Development (TDD) with Node.js and Jest", "url": "https://www.pedroalonso.net/blog/tdd-node-jest/", "published_at": "2023-06-02T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e36d5d45f", "title": "Node.js Security 101: Protecting Your Application from Common Web Attacks", "url": "https://www.pedroalonso.net/blog/node-security-101/", "published_at": "2023-01-23T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e379f8417", "title": "A Beginner's Guide to Docker Containers and Images", "url": "https://www.pedroalonso.net/blog/docker-introduction/", "published_at": "2022-02-04T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e37af54d4", "title": "Hosting NodeJs Apps on Your Own Heroku, Using Dokku", "url": "https://www.pedroalonso.net/blog/deploying-nodejs-dokku/", "published_at": "2021-09-23T22:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e382b768e", "title": "Automate the Deployment of PostgreSQL to EC2 ARM Using Terraform", "url": "https://www.pedroalonso.net/blog/using-terraform-automate-postgresql-ec2-deployment/", "published_at": "2021-01-21T09:00:00+00:00" }, { "id": "01a087be-d05a-7033-9504-733e38d28d94", "title": "Hosting PostgreSQL on a t4g Graviton2 ARM Instance on AWS EC2", "url": "https://www.pedroalonso.net/blog/hosting-postgresql-t4g-graviton2-aws/", "published_at": "2021-01-12T09:00:00+00:00" } ] posts Claim your blog
Back to pedroalonso.net
Blog · corpus.blog/blogs/pedroalonso.net/posts

pedroalonso.net

pedroalonso.net

2026

2025

2024

2023

2022

2021