|
588 | 588 | { "label": "Data model", "value": "Database-per-tenant" } |
589 | 589 | ] |
590 | 590 | }, |
| 591 | + "llarjove-rag-chatbot": { |
| 592 | + "sections": [ |
| 593 | + { |
| 594 | + "heading": "Context", |
| 595 | + "body": "Conversational assistant for young people aged 18-35 in Catalonia looking for housing: available aid (Bono Alquiler Joven, regional and municipal grants), tenant rights (LAU, deposits, rent updates) and active programs with their deadlines (Borsa Jove, HPO). Deployed in production on Railway with a public repository." |
| 596 | + }, |
| 597 | + { |
| 598 | + "heading": "RAG pipeline", |
| 599 | + "body": "Offline ingestion of curated official documentation (aid programs, rights, guides and laws): loading, chunking, embeddings and a vector store. At runtime each question is embedded, context is retrieved through semantic search with reranking, and the answer is generated with GPT-4, validated and returned with cited sources and a confidence level." |
| 600 | + }, |
| 601 | + { |
| 602 | + "heading": "Backend", |
| 603 | + "body": "Fastify + TypeScript API with the pipeline organized into modules (ingestion, retrieval, generation) and a chat endpoint. Responses return answer, sources and confidence so users can verify the information." |
| 604 | + }, |
| 605 | + { |
| 606 | + "heading": "Frontend", |
| 607 | + "body": "React 19 + Vite 6 + Tailwind CSS v4 interface with a custom design system (brand identity, color and typography tokens) and 59 component tests with Vitest and Testing Library." |
| 608 | + }, |
| 609 | + { |
| 610 | + "heading": "Approach", |
| 611 | + "body": "An applied-AI project with social impact: official housing information is scattered and hard to interpret; the assistant centralizes it and answers in plain language, always citing the official source." |
| 612 | + } |
| 613 | + ], |
| 614 | + "metrics": [ |
| 615 | + { "label": "Stack", "value": "Fastify · GPT-4" }, |
| 616 | + { "label": "Frontend", "value": "React 19 + Vite" }, |
| 617 | + { "label": "Frontend tests", "value": "59" }, |
| 618 | + { "label": "Deployment", "value": "Railway" } |
| 619 | + ] |
| 620 | + }, |
| 621 | + "vitaliber-crm-erp-v2": { |
| 622 | + "sections": [ |
| 623 | + { |
| 624 | + "heading": "Context", |
| 625 | + "body": "Complete rewrite of the legacy CRM/ERP of VitaLiber, a telemarketing company with 5-20 agents in intensive daily use. The previous system (MySQL, 28 tables) carried severe technical debt. V2 replaces it with a clean domain model: CRM, telemarketing, sales (publishing catalogue), billing with SEPA direct debit, and email." |
| 626 | + }, |
| 627 | + { |
| 628 | + "heading": "Multi-tenant with Row-Level Security", |
| 629 | + "body": "Per-provider data isolation enforced in the database itself: PostgreSQL 15 with Row-Level Security policies. A Doctrine postConnect listener sets the active tenant per connection and verifies it against the user-provider access table. JWT authentication with refresh tokens and an active-provider selector. GDPR-aware design." |
| 630 | + }, |
| 631 | + { |
| 632 | + "heading": "Backend and schema", |
| 633 | + "body": "REST API with Symfony 7 + API Platform 4 and Swagger UI. The schema is owned by SQL migrations with DBmate (Doctrine acts as a query layer only), organized into 7 logical PostgreSQL schemas (core, crm, tmk, sales, billing, comms, audit). Outbox-lite auditing: domain events are written in the same transaction." |
| 634 | + }, |
| 635 | + { |
| 636 | + "heading": "End-to-end typed frontend", |
| 637 | + "body": "React 18 + strict TypeScript + Vite with Tailwind and shadcn/ui. The API client is generated from OpenAPI with orval: TanStack Query hooks, types and Zod schemas kept in sync with the backend. Internationalization with react-intl (Spanish base, ready for Catalan and English)." |
| 638 | + }, |
| 639 | + { |
| 640 | + "heading": "Process and status", |
| 641 | + "body": "Phased delivery mirroring the migration plan (8 phases with GitHub milestones and issues): identity & access, catalogs, CRM, telemarketing, sales and communications already merged to main. Decisions documented in 7 ADRs, a PNPM + Composer + Taskfile monorepo, CI/CD and PHPUnit + Vitest test suites, including RLS isolation tests. Live-data-only migration, keeping the legacy database as a read-only archive." |
| 642 | + } |
| 643 | + ], |
| 644 | + "metrics": [ |
| 645 | + { "label": "Phases delivered", "value": "6 of 8" }, |
| 646 | + { "label": "ADRs", "value": "7" }, |
| 647 | + { "label": "PostgreSQL schemas", "value": "7" }, |
| 648 | + { "label": "Isolation", "value": "Per-tenant RLS" } |
| 649 | + ] |
| 650 | + }, |
591 | 651 | "fastbyte-api-servicios": { |
592 | 652 | "sections": [ |
593 | 653 | { |
|
713 | 773 | "categoryId": "facturacion-compliance", |
714 | 774 | "imageUrl": "/images/projects/gestiono-mi-negocio.webp" |
715 | 775 | }, |
| 776 | + { |
| 777 | + "id": "llarjove-rag-chatbot", |
| 778 | + "title": "LlarJove — RAG housing assistant for young people", |
| 779 | + "description": "RAG chatbot that helps young people aged 18-35 in Catalonia find housing: available aid (Bono Alquiler Joven, regional and municipal grants), tenant rights (LAU) and active programs with deadlines. Full RAG pipeline over official sources: document ingestion and chunking, embeddings with semantic search and reranking, and GPT-4 generation that cites sources and reports a confidence level. Fastify + TypeScript backend and React 19 + Vite frontend with a custom design system. Deployed in production on Railway.", |
| 780 | + "tech": [ |
| 781 | + "TypeScript", |
| 782 | + "Node.js", |
| 783 | + "Fastify", |
| 784 | + "RAG", |
| 785 | + "OpenAI GPT-4", |
| 786 | + "React 19", |
| 787 | + "Vite", |
| 788 | + "Tailwind CSS", |
| 789 | + "Docker", |
| 790 | + "Railway" |
| 791 | + ], |
| 792 | + "links": { |
| 793 | + "github": "https://github.com/GMNAPI/llarjove", |
| 794 | + "demo": "https://llarjove-production.up.railway.app/" |
| 795 | + }, |
| 796 | + "categoryId": "ia-chatbots" |
| 797 | + }, |
| 798 | + { |
| 799 | + "id": "vitaliber-crm-erp-v2", |
| 800 | + "title": "VitaLiber CRM/ERP v2 — Multi-tenant rewrite with PostgreSQL RLS", |
| 801 | + "description": "Complete rewrite of a telemarketing company's legacy CRM/ERP (MySQL, 28 tables, severe technical debt) onto a modern, multi-tenant, GDPR-aware stack. Per-provider data isolation with PostgreSQL 15 Row-Level Security, a REST API built with Symfony 7 + API Platform 4 (JWT + refresh tokens) and a React 18 + TypeScript frontend with an OpenAPI-generated client (orval → TanStack Query + Zod). Phased delivery documented with ADRs: identity & access, catalogs, CRM, telemarketing, sales and email already merged to main; live-data-only migration keeping the legacy database as a read-only archive.", |
| 802 | + "tech": [ |
| 803 | + "Symfony 7", |
| 804 | + "API Platform 4", |
| 805 | + "PHP 8.3", |
| 806 | + "PostgreSQL", |
| 807 | + "Row-Level Security", |
| 808 | + "React 18", |
| 809 | + "TypeScript", |
| 810 | + "TanStack Query", |
| 811 | + "Tailwind CSS", |
| 812 | + "shadcn/ui", |
| 813 | + "Docker", |
| 814 | + "Multi-tenant" |
| 815 | + ], |
| 816 | + "links": {}, |
| 817 | + "categoryId": "arquitectura-avanzada" |
| 818 | + }, |
716 | 819 | { |
717 | 820 | "id": "vita-liber-erp-interno", |
718 | 821 | "title": "Vita Liber - ERP Rescue & Modernisation", |
|
0 commit comments