feat: complete content overhaul - projects, infrastructure, personal brand (no empire talk)
CI/CD Pipeline / Build & Deploy (push) Failing after 42s

This commit is contained in:
wh-leader
2026-05-11 12:55:24 +02:00
parent 8a30951a64
commit 8cd0b2fa24
2 changed files with 266 additions and 57 deletions
+73
View File
@@ -0,0 +1,73 @@
---
title: "WarrantyHub"
description: "Plataforma digital para gestionar todas las garantías de tus productos del hogar desde un solo lugar"
url: "https://warrantyhub.impresion3d.pro"
github: ""
status: "development"
tags: ["React", "FastAPI", "PostgreSQL", "SaaS"]
startDate: 2026-04-15
featured: true
image: ""
---
# WarrantyHub
**Gestión digital de garantías para el hogar**
## El Problema
Todos tenemos el mismo problema: compramos electrodomésticos, gadgets, muebles... y guardamos los tickets y garantías en algún cajón. Cuando algo se rompe y necesitas reclamar:
- ❌ No encuentras el ticket
- ❌ No sabes si todavía está en garantía
- ❌ No tienes los datos del establecimiento
- ❌ El proceso de reclamación es un caos
**WarrantyHub resuelve esto.**
## La Solución
Una plataforma donde guardas todas tus garantías digitalmente:
**Digitalización rápida**: Foto del ticket y listo
**Recordatorios**: Te avisamos antes de que expire la garantía
**Organización**: Todos tus productos en un solo lugar
**Búsqueda fácil**: Encuentra cualquier garantía en segundos
**Proceso guiado**: Te ayudamos con el proceso de reclamación
## Stack Técnico
**Frontend:**
- React + TypeScript
- Tailwind CSS
- Vite
**Backend:**
- FastAPI (Python)
- PostgreSQL
- Docker + Portainer
**Features actuales:**
- Autenticación de usuarios
- Subida y digitalización de tickets (OCR)
- Gestión de productos y garantías
- Notificaciones de expiración
## Estado Actual
🚧 **En desarrollo activo**
Trabajando en:
- Sistema de recordatorios automáticos
- Mejora de OCR para extracción de datos
- Integración con tiendas para importar garantías automáticamente
## Por Qué Este Proyecto
Es un problema que yo mismo tenía. Y después de hablar con amigos y familia, descubrí que **todos** tienen el mismo problema.
No es sexy. No es AI generativa. Pero resuelve un problema real que la gente tiene cada día.
---
**Status:** Pronto en beta privada. [Suscríbete](/blog) para recibir invitación.
+192 -56
View File
@@ -6,7 +6,7 @@ import Footer from '../components/layout/Footer.astro';
<BaseLayout <BaseLayout
title="Sobre mí" title="Sobre mí"
description="Indie builder español construyendo productos SaaS. De desarrollador a emprendedor, compartiendo el viaje hacia €4M ARR." description="Builder español. De orfebre a fotógrafo a developer. Construyendo productos y compartiendo el viaje."
> >
<Header /> <Header />
<main class="flex-1 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <main class="flex-1 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@@ -24,57 +24,163 @@ import Footer from '../components/layout/Footer.astro';
<div class="flex-1"> <div class="flex-1">
<h2 class="text-2xl font-semibold mb-4 text-text-primary">Hola 👋</h2> <h2 class="text-2xl font-semibold mb-4 text-text-primary">Hola 👋</h2>
<p class="text-text-secondary text-lg leading-relaxed"> <p class="text-text-secondary text-lg leading-relaxed">
Soy David, desarrollador e indie builder español. Estoy construyendo Soy David, builder español. No empecé en tech - fui orfebre, luego fotógrafo profesional
un portfolio de productos SaaS enfocados en el mercado español y europeo, durante 13 años, formador para LinkedIn Learning, y developer. Ahora construyo productos
con el objetivo de alcanzar €4M ARR. que resuelven problemas reales.
</p> </p>
</div> </div>
</div> </div>
<section class="mb-12"> <section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Mi Historia</h2> <h2 class="text-3xl font-semibold mb-4">El Camino</h2>
<p class="text-text-secondary leading-relaxed mb-4"> <p class="text-text-secondary leading-relaxed mb-4">
Después de años trabajando como desarrollador, decidí dar el salto al emprendimiento Empecé trabajando metal con mis manos como orfebre. Un día me interesé por la fotografía,
tecnológico. Vi una oportunidad en el mercado español: muchas soluciones B2B están y esa obsesión me llevó a construir mi propia marca durante 13 años. Cuando no podía
dominadas por empresas extranjeras que no entienden las particularidades del mercado permitirme el equipo que necesitaba, lo improvisaba. Construía soportes, modificaba
local, especialmente en temas de cumplimiento normativo. accesorios, hacía funcionar lo que tenía.
</p> </p>
<p class="text-text-secondary leading-relaxed mb-4"> <p class="text-text-secondary leading-relaxed mb-4">
Mi enfoque es construir en público, compartiendo tanto los éxitos como los fracasos. Ese mismo impulso me llevó a aprender Python, a montar mi propia impresora 3D desde cero,
Creo en la transparencia y en la comunidad indie, y quiero contribuir al ecosistema a trabajar en Qloudea desarrollando herramientas internas mientras gestionaba redes sociales
de emprendedores españoles compartiendo mi viaje. y daba soporte técnico. Luego developer Python en NTT Data, y ahora trabajo en KEO
Connectivity con protocolos IoT para sistemas de energía (EEBUS).
</p>
<p class="text-text-secondary leading-relaxed mb-4">
<strong class="text-text-primary">El patrón siempre es el mismo:</strong> identificar un
problema, obsesionarse con resolverlo, aprender lo que haga falta para solucionarlo.
</p> </p>
</section> </section>
<section class="mb-12"> <section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Filosofía de Construcción</h2> <h2 class="text-3xl font-semibold mb-4">Qué Hago Ahora</h2>
<p class="text-text-secondary leading-relaxed mb-4">
Trabajo full-time en KEO como Field Application Engineer, donde me encargo de documentación
técnica, automatización de flujos de trabajo, herramientas internas y soporte de cara al cliente.
</p>
<p class="text-text-secondary leading-relaxed mb-4">
En paralelo, construyo <strong class="text-primary">WarrantyHub</strong> - una plataforma
para que usuarios finales gestionen las garantías de sus productos del hogar desde un solo lugar.
Es un problema que yo mismo tenía, y descubrí que todos mis amigos y familia tienen el mismo problema.
</p>
<p class="text-text-secondary leading-relaxed mb-4">
También trabajo en otros proyectos experimentales: CLIs de productividad, herramientas de
automatización, bots de Discord, y templates para acelerar desarrollo Python.
</p>
</section>
<section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Proyectos Actuales</h2>
<div class="space-y-4">
<div class="bg-surface p-5 rounded-lg border border-text-tertiary/20">
<h3 class="text-lg font-semibold text-primary mb-2">WarrantyHub</h3>
<p class="text-text-secondary text-sm">
Gestor digital de garantías del hogar. PWA self-hosted con modelo freemium.
Stack: React + FastAPI + PostgreSQL.
</p>
</div>
<div class="bg-surface p-5 rounded-lg border border-text-tertiary/20">
<h3 class="text-lg font-semibold text-primary mb-2">TimeNet CLI</h3>
<p class="text-text-secondary text-sm">
CLI para gestionar fichajes de TimeNet desde terminal. Automatización de entrada/salida
y reportes de horas trabajadas.
</p>
</div>
<div class="bg-surface p-5 rounded-lg border border-text-tertiary/20">
<h3 class="text-lg font-semibold text-primary mb-2">Python Project Template</h3>
<p class="text-text-secondary text-sm">
Template opinionado para proyectos Python: uv, ruff, mypy, pytest, Docker, Portainer.
CI/CD con Gitea Actions.
</p>
</div>
<div class="bg-surface p-5 rounded-lg border border-text-tertiary/20">
<h3 class="text-lg font-semibold text-primary mb-2">Hermes Stack</h3>
<p class="text-text-secondary text-sm">
Stack de Hermes Agent gateway para QNAP/Portainer. Automatización con agentes AI
para gestión de infraestructura.
</p>
</div>
<div class="bg-surface p-5 rounded-lg border border-text-tertiary/20">
<h3 class="text-lg font-semibold text-primary mb-2">Otros Experimentos</h3>
<p class="text-text-secondary text-sm">
Bots de Discord (iRacing), herramientas de automatización (Portainer backups),
scripts de utilidad (FLAC tagging, cookie extraction), y más.
</p>
</div>
</div>
</section>
<section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Infraestructura Self-Hosted</h2>
<p class="text-text-secondary leading-relaxed mb-4">
Todos mis proyectos corren en infraestructura local self-hosted. Prefiero controlar
completamente el stack y mantener costes bajos mientras experimento.
</p>
<div class="bg-surface p-6 rounded-lg border border-primary/20">
<h3 class="text-xl font-semibold mb-4 text-primary">Stack Actual</h3>
<ul class="space-y-2 text-text-secondary">
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">Servidor físico</strong> (192.168.1.30) -
Docker host principal</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">Portainer</strong> - Orquestación de
stacks y containers</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">Gitea</strong> (gitlab.impresion3d.pro) -
Git hosting + Docker registry + CI/CD</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">MinIO</strong> - Object storage (S3-compatible)</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">Nginx Proxy Manager</strong> - Reverse proxy
con SSL automático (Let's Encrypt)</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span><strong class="text-text-primary">PostgreSQL</strong> - Base de datos principal
para aplicaciones</span>
</li>
</ul>
<p class="text-text-secondary text-sm mt-4">
CI/CD completamente automatizado: push a main → build image → push a registry →
deploy a Portainer. Todo en infraestructura local.
</p>
</div>
</section>
<section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Por Qué Build-in-Public</h2>
<ul class="space-y-3"> <ul class="space-y-3">
<li class="flex items-start"> <li class="flex items-start">
<span class="text-primary mr-2">→</span> <span class="text-primary mr-2">→</span>
<span class="text-text-secondary"> <span class="text-text-secondary">
<strong class="text-text-primary">Spanish-first:</strong> Productos diseñados <strong class="text-text-primary">Responsabilidad:</strong> Es más difícil abandonar
para el mercado español y europeo cuando compartes progreso públicamente
</span> </span>
</li> </li>
<li class="flex items-start"> <li class="flex items-start">
<span class="text-primary mr-2">→</span> <span class="text-primary mr-2">→</span>
<span class="text-text-secondary"> <span class="text-text-secondary">
<strong class="text-text-primary">Build-in-public:</strong> Transparencia <strong class="text-text-primary">Enseñar:</strong> Siempre he sido formador
total en métricas, aprendizajes y decisiones (LinkedIn Learning, Podcast CulturaNAS 2000+ subs). Compartir lo que aprendo es parte de quién soy
</span> </span>
</li> </li>
<li class="flex items-start"> <li class="flex items-start">
<span class="text-primary mr-2">→</span> <span class="text-primary mr-2">→</span>
<span class="text-text-secondary"> <span class="text-text-secondary">
<strong class="text-text-primary">AI-assisted:</strong> Aprovechando herramientas <strong class="text-text-primary">Comunidad:</strong> Quiero conectar con otros
de IA para acelerar desarrollo (79% AI-assisted en WarrantyHub) builders españoles que están en el mismo viaje
</span>
</li>
<li class="flex items-start">
<span class="text-primary mr-2">→</span>
<span class="text-text-secondary">
<strong class="text-text-primary">Compliance-focused:</strong> Ventaja competitiva
en regulaciones españolas y europeas
</span> </span>
</li> </li>
</ul> </ul>
@@ -83,47 +189,77 @@ import Footer from '../components/layout/Footer.astro';
<section class="mb-12"> <section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">Stack Técnico</h2> <h2 class="text-3xl font-semibold mb-4">Stack Técnico</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 not-prose"> <div class="grid grid-cols-2 md:grid-cols-3 gap-4 not-prose">
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">React</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">TypeScript</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Node.js</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Astro</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Tailwind CSS</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Docker</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">PostgreSQL</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Python</div> <div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Python</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">FastAPI</div> <div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">FastAPI</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">React</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">TypeScript</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">PostgreSQL</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Docker</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Tailwind CSS</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">Astro</div>
<div class="bg-surface px-4 py-3 rounded-lg border border-text-tertiary/20">n8n</div>
</div> </div>
</section> </section>
<section class="mb-12"> <section class="mb-12">
<h2 class="text-3xl font-semibold mb-4">En Qué Estoy Trabajando</h2> <h2 class="text-3xl font-semibold mb-4">Experiencia</h2>
<div class="bg-surface p-6 rounded-lg border border-primary/20"> <div class="space-y-6">
<h3 class="text-xl font-semibold mb-2 text-primary">Portfolio SaaS €4M ARR</h3> <div class="bg-surface p-6 rounded-lg border border-text-tertiary/20">
<p class="text-text-secondary mb-4"> <div class="flex items-start justify-between mb-2">
Construyendo un portfolio de productos SaaS en 3 fases: <h3 class="text-xl font-semibold text-primary">Field Application Engineer</h3>
</p> <span class="text-sm text-text-tertiary whitespace-nowrap ml-4">2023 - Actualidad</span>
<ul class="space-y-2"> </div>
<li class="text-text-secondary"> <p class="text-text-secondary mb-2">KEO Connectivity (Alemania)</p>
<strong class="text-text-primary">Fase 1 (0-8 meses):</strong> WarrantyHub, <p class="text-text-secondary text-sm">
Verifactu compliance, análisis de contratos → €825K ARR Protocolo EEBUS para sistemas IoT de energía (e-movilidad, hogares inteligentes,
</li> bombas de calor). Documentación técnica, automatización con n8n, herramientas internas,
<li class="text-text-secondary"> soporte técnico.
<strong class="text-text-primary">Fase 2 (8-18 meses):</strong> Plataforma </p>
de auditoría, integraciones → €1.8M ARR </div>
</li>
<li class="text-text-secondary"> <div class="bg-surface p-6 rounded-lg border border-text-tertiary/20">
<strong class="text-text-primary">Fase 3 (18+ meses):</strong> Expansión <div class="flex items-start justify-between mb-2">
europea, liderazgo → €4M+ ARR <h3 class="text-xl font-semibold text-primary">Developer Python</h3>
</li> <span class="text-sm text-text-tertiary whitespace-nowrap ml-4">2022 - 2023</span>
</ul> </div>
<p class="text-text-secondary mb-2">NTT Data</p>
<p class="text-text-secondary text-sm">
Desarrollo en Python, Google Cloud, Kubernetes, BigQuery. Análisis de datos y BigData.
</p>
</div>
<div class="bg-surface p-6 rounded-lg border border-text-tertiary/20">
<div class="flex items-start justify-between mb-2">
<h3 class="text-xl font-semibold text-primary">Formador TIC + Developer</h3>
<span class="text-sm text-text-tertiary whitespace-nowrap ml-4">2013 - 2022</span>
</div>
<p class="text-text-secondary mb-2">Qloudea + LinkedIn Learning</p>
<p class="text-text-secondary text-sm">
Desarrollo de herramientas internas (HTML5, CSS, JavaScript, Python, Django, Flutter).
Formador oficial sobre servidores NAS para profesionales. Gestión de RRSS, YouTube,
fotografía de productos.
</p>
</div>
<div class="bg-surface p-6 rounded-lg border border-text-tertiary/20">
<div class="flex items-start justify-between mb-2">
<h3 class="text-xl font-semibold text-primary">Fotógrafo Profesional</h3>
<span class="text-sm text-text-tertiary whitespace-nowrap ml-4">2003 - 2016</span>
</div>
<p class="text-text-secondary mb-2">Marca propia</p>
<p class="text-text-secondary text-sm">
13 años gestionando mi propia marca de fotografía. Creador del Podcast CulturaNAS
(2000+ suscriptores).
</p>
</div>
</div> </div>
</section> </section>
<section> <section>
<h2 class="text-3xl font-semibold mb-4">Conecta Conmigo</h2> <h2 class="text-3xl font-semibold mb-4">Conecta Conmigo</h2>
<p class="text-text-secondary mb-6"> <p class="text-text-secondary mb-6">
Siempre estoy abierto a conversar con otros builders, inversores, o simplemente Siempre abierto a conversar con otros builders, gente interesada en EEBUS/IoT,
personas interesadas en emprendimiento tecnológico español. o simplemente personas curiosas sobre construcción de productos.
</p> </p>
<div class="flex flex-wrap gap-4 not-prose"> <div class="flex flex-wrap gap-4 not-prose">
<a <a
@@ -136,7 +272,7 @@ import Footer from '../components/layout/Footer.astro';
X (Twitter) X (Twitter)
</a> </a>
<a <a
href="https://linkedin.com/in/davidaragon" href="https://linkedin.com/in/david-aragon-galiana"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="bg-primary/10 hover:bg-primary/20 text-primary px-6 py-3 rounded-lg class="bg-primary/10 hover:bg-primary/20 text-primary px-6 py-3 rounded-lg