Skip to content

Commit bac46dc

Browse files
committed
Añado un proyecto a la lista
1 parent a57a181 commit bac46dc

4 files changed

Lines changed: 42 additions & 8 deletions

File tree

assets/css/styles.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,4 +987,5 @@ p{
987987
/* ===== Paletas thumbs nuevas ===== */
988988
.project-thumb.thumb-realtime{ --a: rgba(34,211,238,.20); --b: rgba(196,181,253,.16); }
989989
.project-thumb.thumb-testing{ --a: rgba(250,204,21,.14); --b: rgba(148,163,184,.18); }
990-
.project-thumb.thumb-labs{ --a: rgba(250,204,21,.14); --b: rgba(196,181,253,.18); }
990+
.project-thumb.thumb-labs{ --a: rgba(250,204,21,.14); --b: rgba(196,181,253,.18); }
991+
.project-thumb.thumb-rag{ --a: rgba(34,197,94,.16); --b: rgba(196,181,253,.18); }

assets/i18n/en.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@
155155
"p6_solution": "Focused mini-projects: coroutines (dispatchers/cancellation), multimedia (resources/lifecycle), persistence (CRUD).",
156156
"p6_result": "Evidence: 3 repos with features + screenshots/docs per mini-case.",
157157

158+
"p7_title": "Knowledge Ops Hub (Local RAG + automation)",
159+
"p7_desc": "100% local pipeline to turn PDFs into a searchable RAG knowledge base (answers with citations) and automate ingestion + daily digests with n8n.",
160+
"p7_why": "It helped me build a full end-to-end system: ingest → page extraction → embeddings → semantic search → answers with sources, fully local, with a secured API (JWT).",
161+
"p7_problem": "When you pile up PDFs (guides, notes, specs), finding reliable answers is slow and hard to trace.",
162+
"p7_solution": "Local stack with n8n workflows, Spring Boot API (JWT), Postgres + pgvector, and Ollama for embeddings + RAG returning `sources[]` with page/snippet evidence.",
163+
"p7_result": "Evidence: `/ask` returns an answer + cited sources/pages; WF1 ingests PDFs from `inbox/` and WF2 writes daily digests to `outbox/` (docs + Postman collection).",
164+
158165
"p6_cases": [
159166
{
160167
"title": "Concurrency without blocking UI (Coroutines)",

assets/i18n/es.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@
155155
"p6_solution": "Mini-proyectos enfocados: corrutinas (dispatchers/cancelación), multimedia (recursos/ciclo de vida) y persistencia (CRUD).",
156156
"p6_result": "Evidencia: 3 repos con features + capturas/documentación por mini-caso.",
157157

158+
"p7_title": "Knowledge Ops Hub (RAG local + automatización)",
159+
"p7_desc": "Pipeline 100% local para convertir PDFs en una base de conocimiento consultable con RAG (respuestas con citas) y automatizar ingesta y digests con n8n.",
160+
"p7_why": "Me permitió montar un sistema completo end-to-end: ingesta → extracción por páginas → embeddings → búsqueda semántica → respuesta con fuentes, todo en local y con API segura (JWT).",
161+
"p7_problem": "Cuando acumulas PDFs (guías, apuntes, specs), encontrar respuestas fiables es lento y poco trazable.",
162+
"p7_solution": "Stack local con n8n (workflows de ingesta/digest), Spring Boot API (JWT), Postgres + pgvector y Ollama para embeddings y RAG con `sources[]` por página/snippet.",
163+
"p7_result": "Evidencia: endpoint `/ask` devuelve respuesta + fuentes/páginas; WF1 procesa PDFs desde `inbox/` y WF2 genera digests en `outbox/` (docs + colección Postman).",
164+
158165
"p6_cases": [
159166
{
160167
"title": "Concurrencia sin bloquear UI (Coroutines)",

assets/js/app.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,25 @@ function getProjectItems(proj){
295295
{ label:"Persistence", cls:"t-data" }
296296
],
297297
cases: proj.p6_cases || []
298+
},
299+
{
300+
title: proj.p7_title,
301+
desc: proj.p7_desc,
302+
why: proj.p7_why,
303+
problem: proj.p7_problem,
304+
solution: proj.p7_solution,
305+
result: proj.p7_result,
306+
link: "https://github.com/SebiGitHub/knowledge-ops-hub",
307+
iconClass: "fa-solid fa-brain",
308+
thumbClass: "thumb-rag",
309+
tech: [
310+
{ label:"Spring Boot", cls:"t-java" },
311+
{ label:"Postgres + pgvector", cls:"t-data" },
312+
{ label:"Ollama", cls:"t-soft-cur" },
313+
{ label:"n8n", cls:"t-soft-org" },
314+
{ label:"Docker", cls:"t-github" },
315+
{ label:"RAG", cls:"t-soft-cur" }
316+
]
298317
}
299318
];
300319
}
@@ -386,21 +405,22 @@ function setupProjectsCarousel() {
386405
const stage = document.getElementById("project-stage");
387406
if (!prev || !next || !stage) return;
388407

408+
const getItemsSafe = () => getProjectItems(STATE.dict?.projects);
409+
389410
prev.addEventListener("click", () => {
390-
const items = getProjectsList();
391-
if (!items.length) return;
411+
const items = getItemsSafe();
392412
PROJECT_INDEX = clampIndex(PROJECT_INDEX - 1, items.length);
393413
renderProjects();
394414
});
395415

396416
next.addEventListener("click", () => {
397-
const items = getProjectsList();
398-
if (!items.length) return;
417+
const items = getItemsSafe();
399418
PROJECT_INDEX = clampIndex(PROJECT_INDEX + 1, items.length);
400419
renderProjects();
401420
});
402421

403422
let x0 = null;
423+
404424
stage.addEventListener("touchstart", (e) => {
405425
x0 = e.touches?.[0]?.clientX ?? null;
406426
}, { passive: true });
@@ -412,16 +432,15 @@ function setupProjectsCarousel() {
412432
const dx = x1 - x0;
413433
if (Math.abs(dx) < 60) return;
414434

415-
const items = getProjectsList();
416-
if (!items.length) return;
417-
435+
const items = getItemsSafe();
418436
PROJECT_INDEX = clampIndex(PROJECT_INDEX + (dx < 0 ? 1 : -1), items.length);
419437
renderProjects();
420438
x0 = null;
421439
}, { passive: true });
422440
}
423441

424442

443+
425444
/* =========================================================
426445
CONTACT FORM -> Gmail draft
427446
========================================================= */

0 commit comments

Comments
 (0)