Skip to content

Warcos Labs · 15 projects

Products & Engineering Projects

A selection of production products, AI systems and technical experiments. Live products get a high-level overview; standalone projects include deeper implementation detail.

2026

5 projects

2025

4 projects

2024

5 projects

2023

1 project

Want to collaborate on a project?

I'm always open to interesting collaboration opportunities. Feel free to reach out if you have an idea you'd like to discuss!

2026 · Ongoing

Menorca coastline used for the Awaita project

Awaita is a private, production-oriented AI guide for Menorca. My work focuses on the conversational product layer: grounded answers, RAG logic, retrieval quality, evaluation, safety controls, observability, deployment flow, and continuous improvement from real usage. The public landing, events experience, and broader web presentation are team-owned areas, with another teammate leading much of that outward-facing work.

  • Conversational AI
  • Retrieval Quality
  • Evaluation & Benchmarking
  • Safety Controls
  • Observability
  • CI/CD Operations
  • Owned the chatbot logic that turns curated Menorca knowledge into useful, grounded, multilingual answers
  • Designed and tuned the retrieval workflow so the assistant can answer from controlled sources instead of generic model memory
  • Built evaluation loops for retrieval quality, reranking decisions, prompt behavior, and generated-answer quality before product changes reach users
  • Implemented safety and abuse controls around sessions, protected requests, user identity, feedback, rate limits, and public error handling
  • Connected feedback, analytics, latency, cost, and quality signals so production conversations can be improved from evidence
  • Maintained staged CI/CD workflows and operational checks for controlled releases to staging and production
  • Collaborated with teammate-led web areas such as landing, events, and public content presentation while focusing on AI/backend reliability

The product is private, so this portfolio intentionally avoids repository access, provider names, model names, infrastructure details, prompt structure, ranking parameters, and deployment recipes. The relevant signal is the engineering work behind a production AI assistant: retrieval quality, reliability, safety, observability, and release discipline.

I treat the RAG layer as a quality system rather than a demo feature: curated source material, retrieval tuning, comparative evaluation, regression coverage, and user feedback feed into one continuous improvement loop.

The project is still active in 2026, with ongoing work across answer quality, protected user flows, analytics, operational checks, and staged releases.

Awaita aims to become a virtual tourist guide for Menorca: a practical companion that helps visitors discover places, understand local context, plan better routes, and ask natural questions before or during their trip. The goal is to make island knowledge easier to access through a conversational experience that feels useful, local, and trustworthy.

July 2026 · Ongoing

SoloGangas circular logo on a dark branded background

SoloGangas is a live deal-discovery platform that I designed and operate end to end. It runs a public website alongside a Telegram community of 2K+ subscribers, with automated processing, AI-assisted content workflows, a database-backed backend, monitoring and CI/CD.

  • Python Backend
  • PostgreSQL
  • Applied AI
  • Workflow Automation
  • Production Operations
  • CI/CD
  • Runs continuously in production across its website and a Telegram community with 2K+ subscribers
  • Automates the full deal lifecycle — processing, enrichment, publication and maintenance across channels
  • Database-backed backend as the operational source of truth for reliable asynchronous workflows
  • Containerized, staged CI/CD with automated validation, health checks and recovery safeguards
  • Monitoring, alerting, backups and maintenance built for unattended operation
  • AI treated as one component inside a larger system, with validation and graceful failure paths around external dependencies

Python and PostgreSQL at the core, with a public web surface and multi-channel delivery, deployed through containers with CI/CD, testing, observability, backups and operational recovery.

SoloGangas helps a real audience discover and follow online deals through its web catalogue and Telegram. For me it is a long-running production environment where automation, reliability and maintainability matter as much as the AI parts of the pipeline.

August 2026 · Ongoing

Three-dimensional OpenCode permission checkpoint with shield and approval lights

OpenCode Permission Reviewer is an unofficial community plugin for OpenCode that reviews every `ask` permission instead of waiting for a keystroke on safe, routine actions. A dedicated, tool-free child session reads the pending request, bounded transcript evidence, recovered user intent, and a review policy you control, then allows once, denies with rationale, or escalates to the human. Critical risk is never auto-approved, and anything broken or uncertain fails safe to manual review.

  • TypeScript + Bun
  • OpenCode Plugin
  • Policy Engine
  • Tool-free Reviewer
  • Shell / Evidence Analysis
  • GitHub Actions CI
  • Intercepts `permission.asked` events and reviews only actions already classified as `ask` — `allow` and `deny` policy never reaches the model
  • Runs a deterministic emergency brake before any model call: quote-aware, wrapper-aware shell analysis catches root destruction and direct credential export patterns
  • Builds bounded, redacted evidence from recent transcript, recovered user intent, and optional read-only SSH / local-script / Git enrichment without modifying the filesystem
  • Invokes a tool-free child reviewer session that cannot call tools or request permissions recursively, then enforces hard decision invariants in code
  • Auto-approvals are always `once` (never `always`), with rationale annotated onto the tool result; denials return feedback the agent can use
  • Lets a human keystroke mid-review supersede the automatic decision without double replies or stale annotations
  • Optional SolidJS TUI overlay shows reviewing / approved / blocked state with confidence and rationale, while a broken TUI transport never changes the safety outcome
  • Writes one JSONL audit record per review (mode 0600), hashing remote SSH commands as SHA-256 instead of storing plaintext

Built in strict TypeScript on Bun as a dual server + TUI plugin for OpenCode ≥ 1.18.11. The reviewer is a normal OpenCode model invocation with tools disabled — no separate model SDK dependency — so any configured provider/model that follows JSON schemas can act as the reviewer.

Safety is enforced in layers: an emergency-brake shell lexer and capability analysis supply facts before the model runs; `enforceDecision` invariants block critical risk, low-confidence answers, invalid output, errors, and timeouts from becoming silent approvals; project config cannot silently weaken user-level policy.

Evidence providers cover SSH destinations and remote commands, local interpreter scripts (Python/Node/Bun/shell/Ruby/Perl), and Git state snapshots with locking/hooks disabled, short timeouts, and bounded output. Credential patterns (Bearer, cloud keys, JWTs, private keys, URL userinfo, cookies) are redacted before anything reaches the reviewer provider.

The public repository includes an `explain` CLI for dry-running commands through the capability analyzer and policy engine, Apache-2.0 licensing with NOTICE attribution acknowledging OpenAI Codex Guardian as design inspiration, SECURITY.md threat-model notes, and a CI pipeline that runs format, lint, typecheck, tests, and build.

Coverage is intentionally heavy relative to the surface area: roughly 250 automated cases across emergency-brake patterns, decision invariants, evidence redaction, config trust boundaries, and races where a human supersedes auto-review. A separate live harness exists for end-to-end checks against a real OpenCode server.

The plugin is useful when you run OpenCode with a real permission policy and get tired of pressing Enter on safe, reversible actions — while still wanting destructive, networked, or poorly justified commands to stay blocked or surfaced. It is a defense-in-depth aid for daily agent work, not a sandbox substitute: the point is fewer interruptions on routine asks without handing the agent a blank check.

August 2026 · Beta

Guardian shield with a gated watcher mark and allow, escalate, deny status lights

OMP Guardian is an unofficial community extension for Oh My Pi (OMP) that shadows Bash and inspects sensitive tool calls, asking a separate tool-free model process for one structured decision: allow, deny, or escalate. Routine reads, bounded workspace writes, and recognized local tests take a cheap deterministic route, while network access, deletion, Git mutation, package lifecycle execution, privilege changes, remote operations, protected-path access, and unknown tools go through model review or an emergency brake.

  • TypeScript + Bun
  • OMP Extension
  • Emergency Brake
  • Tool-free Reviewer
  • Redacted Audit Trail
  • GitHub Actions CI
  • Shadows OMP's Bash tool and delegates to native Bash exactly once, only after an allow decision — it does not implement an independent shell
  • Routes routine reads, bounded workspace writes, and recognized local tests through a cheap deterministic fast path instead of the model
  • Runs a deterministic emergency brake before any model call: unmistakable root destruction, destructive block-device operations, fork bombs, configured executables, and obvious credential exfiltration are rejected outright
  • Reviews network access, deletion, Git mutation, package lifecycle execution, privilege changes, remote operations, protected-path access, browser input, Python/notebook execution, MCP tools, and unknown tools
  • Spawns a fresh `omp -p` child reviewer with tools, saved sessions, skills, rules, LSP, PTY, title generation, and prewalk disabled, inheriting only the selected model and thinking level
  • Fails closed on invalid output, timeout, provider failure, missing model, or unavailable manual review — broken never becomes an approval
  • Writes append-only mode-`0600` JSONL audit records with an action hash instead of the raw command; secrets are redacted before they ever reach the reviewer provider
  • Per-session circuit breaker stops the active turn after three consecutive or twenty cumulative denials

Built in strict TypeScript on Bun as an OMP extension (one production entry point: `dist/index.js`). The reviewer is a normal OMP model invocation with ambient agent features disabled — no separate model SDK — so any configured provider/model that follows the versioned structured decision schema can act as the reviewer. Initial public beta is `0.1.0-beta.1`, targeting OMP `>=17.2.12 <18`.

Safety is layered: an emergency-brake shell lexer and executable deny list run first; static tool, command, capability, and path analysis decide routine vs. review; bounded, redacted evidence enriches the request without authorizing it; deterministic confidence, risk, authorization, scope, and evidence gates can only make an allow more restrictive after the model answers.

Evidence providers cover Bash capabilities, Git state relevant to pending mutations, local script contents when safely readable (Python/Node/Bun/shell/Ruby/Perl), and SSH destination, remote semantics, and bounded stdin code. Credential patterns (Bearer, cloud keys, JWTs, private keys, URL userinfo, cookies) are redacted before anything reaches the reviewer, and missing evidence is surfaced explicitly rather than hidden.

The trust boundary is asymmetric: trusted global config may select a dedicated reviewer model, thinking level, timeout, confidence threshold, and policy text, while repository config can only tighten behavior (raise confidence, add reviewed tools or protected paths, add denied executables, disable deterministic allow paths, enable subagent-spawn review, or escalate from `manual` to `deny`). It cannot disable auditing, redirect the audit file, lower confidence, remove protections, add trusted roots, or relax `deny` back to `manual`.

The repository is intentionally heavy relative to its surface area: focused tests cover capability analysis, decision invariants, the emergency brake, evidence enrichment (Git, SSH, local scripts), redaction, shell lexing, the OMP runtime, package smoke, and concurrency stress. CI runs format, lint, typecheck, tests, and build on a Bun matrix, plus a coverage gate and CodeQL; a release candidate also requires a fresh real-OMP live smoke. Apache-2.0 licensing with a NOTICE attributing design inspiration to OpenAI Codex Guardian.

The extension is useful when you run OMP with real approval boundaries and want fewer interruptions on safe, reversible actions — while still forcing destructive, networked, remote, or poorly justified operations through an independent review or a hard block. It is explicitly defense in depth, not a sandbox or a replacement for operating-system isolation: the point is safer auto-approval behavior without handing the agent a blank check.

Created June 2026

Minimal Contextarium wordmark

Contextarium is a local-first context, memory, and RAG layer for coding agents. It runs a FastAPI web panel and an MCP-compatible HTTP/JSON-RPC endpoint so agents can search indexed documentation, retrieve source chunks, and manage durable project memory without relying on a hosted service.

  • Python 3.12
  • MCP / JSON-RPC
  • Hybrid RAG
  • DuckDB + SQLite
  • FastAPI Web Panel
  • GitHub Actions CI
  • Runs a local control panel for dashboard status, RAG ingestion, MCP tool toggles, project memory, configuration, and logs
  • Ingests documentation from a sitemap or a `txt/` URL list, then crawls, chunks, embeds, and atomically replaces the DuckDB RAG index
  • Exposes MCP tools for `hybrid_search`, `chunks_by_url`, and project-scoped item management through HTTP/JSON-RPC
  • Stores long-lived project memory, docs, bugs, and todos in SQLite with typed metadata, statuses, direct editing, search, and diff-based doc patching
  • Combines dense and lexical retrieval with MMR, optional reranking, output schemas, and graceful degradation when local extensions or rerankers are unavailable
  • Provides ready-to-copy integration snippets for Codex CLI, Claude Code, and GitHub Copilot in VS Code
  • Supports local and cloud embedding modes, Docker deployment, repository checks, and explicit local-only security guidance

This project is still evolving. I may change the name and rework part of the overall logic because I am not fully satisfied yet with the current product shape, especially how the context and memory workflows should feel in daily use.

The backend is a Python 3.12 FastAPI/Uvicorn app with Jinja templates and modular static assets. The MCP server is split into `mcp_server/server.py` for HTTP/JSON-RPC compatibility and `mcp_server/toolset.py` for declarative tool schemas, runtime validation, and structured outputs.

Persistence is intentionally split: DuckDB stores the global RAG corpus (`docs`, `chunks`, and metadata, with VSS/FTS indexes when available), while SQLite stores project-scoped memory/items. The app opens the RAG database read-only while serving queries, validates stored metadata against the active config, and rebuilds indexes through a staging database before atomic swap.

The ingestion and retrieval pipeline includes Crawl4AI crawling, heading/code-aware chunking, local HuggingFace-compatible embeddings or OpenAI cloud embeddings, optional local/cloud reranking, MMR selection, URL penalties, and fallback behavior when optional DuckDB extensions are missing.

The repository includes 49 pytest files covering MCP JSON-RPC behavior, tool schemas, item metadata, UI API contracts, crawling safety, embedding modes, DuckDB lifecycle, docs consistency, and repository hygiene. GitHub Actions runs a lightweight readiness suite on pushes and pull requests.

Contextarium is useful when a developer wants coding agents to keep project context, decisions, docs, bugs, and todos close to the local workspace. The point is controlled context: choose what to index, choose which tools an MCP client can call, and avoid turning private project memory into an external hosted dependency.

September 2025 · Maintained

Minimal XLFusion wordmark

XLFusion is an open-source Python toolkit for reproducible SDXL checkpoint merging. It replaces ad-hoc local scripts with repeatable CLI, GUI, batch, analysis, metadata recovery, and checkpoint algebra workflows, with a strong focus on validation before long-running local work and metadata that explains how each checkpoint was produced.

  • Python Tooling
  • SDXL Workflows
  • CLI / GUI / Batch
  • Metadata Recovery
  • Regression Testing
  • GitHub Actions CI
  • Merges SDXL-derived `.safetensors` checkpoints through legacy, per-resolution, and hybrid merge modes
  • Bakes compatible LoRA weights into UNet and text-encoder targets with an auditable report
  • Runs preflight validation before execution, covering memory estimates, backbone compatibility, affected blocks, locks, component scope, warnings, and risk alerts
  • Supports interactive CLI, GUI, and YAML batch execution from the same validation and runtime contracts
  • Saves reusable presets, batch-compatible YAML, embedded metadata, and recovery folders so previous runs can be inspected and recreated
  • Adds analysis utilities for checkpoint similarity, compatibility, dominance by region/submodule, merge recommendations, and checkpoint algebra
  • Keeps behavior protected with fast unittest coverage, synthetic safetensors fixtures, a smoke-test path, and GitHub Actions CI

The current v2.4.1 public version is packaged as `xlfusion` for Python 3.10+, with console entrypoints for `xlfusion` and `xlfusion-gui`. The package keeps the legacy direct script path available through `python XLFusion.py` while moving the implementation into reusable modules.

The architecture centralizes validation, runtime types, execution flow, batch parsing, memory checks, presets, metadata recovery, LoRA handling, block mapping, and analysis so CLI, GUI, and batch mode do not drift into separate behavior.

The repository is intentionally OSS-safe: it includes examples, tests, documentation, CI, release notes, and maintainer guidance, but no real checkpoints, LoRAs, generated images, local configs, logs, or model binaries.

The project is aimed at SDXL users and maintainers who need repeatable local experiments. Instead of relying on one-off merge scripts and undocumented outputs, XLFusion makes the merge plan, execution settings, source models, metadata, and recovery path explicit enough to review later or rerun from a batch config.

May 2025 · Maintained

Minimal Mas Palabras wordmark

Mas Palabras is a personal vocabulary app for collecting words while studying, reading, working, or living in another language. It turns scattered notes, spreadsheets, screenshots, and chat messages into a structured personal lexicon with language and tag organization, search, JSON import/export, and adaptive quiz practice for words that need review.

  • Language Learning UX
  • Prisma + SQLite
  • Next.js App Router
  • Zod Validation
  • Adaptive Quiz Logic
  • GitHub Actions CI
  • Create vocabulary entries with source word, translation, explanation, language, and tag
  • Normalize source words to prevent duplicates within the same language
  • Browse the lexicon with search, language filters, tag filters, pagination, sorting, editing, deletion, and bulk deletion
  • Practice through quiz sessions targeting all words, new words, or entries that need review based on attempts and accuracy
  • Import JSON vocabulary lists with duplicate handling, missing-language/tag options, flexible date parsing, and per-item incident reporting
  • Export the full vocabulary as JSON so study data stays portable
  • Switch the interface between English, Spanish, and Catalan through a cookie-backed language selector

The current version is a Next.js 16 App Router application written in strict TypeScript, with React 19, Tailwind CSS, Prisma, SQLite, Zod, and Vitest. Reads happen in server-rendered pages, while mutations are handled through server actions and a small number of route handlers for import/export and quiz ending.

Domain logic is split into focused modules for words, settings, quiz sessions, import/export, text normalization, word metrics, flash messages, validation, and Prisma access. Quiz state is persisted in SQLite and tied to an `httpOnly` cookie, with deterministic mixed-direction questions and transaction-based submit/skip handling to avoid double-counting.

The repository includes unit coverage for normalization, word metrics, search/sorting behavior, flash-message helpers, import/export edge cases, and quiz utilities. GitHub Actions runs dependency install, Prisma client generation, Vitest, and production build on pushes and pull requests.

The app is built for local study and data ownership. Its value is not just adding words, but keeping vocabulary searchable, reviewable, exportable, and organized enough to become a living personal dictionary rather than another scattered notes file.

2023 · Refreshed in 2026

Minimal Examino wordmark

Examino is a local-first Flask app for building and practicing multiple-choice exams from private question banks. I originally built it in 2023 while studying DAW, so it is intentionally presented as an earlier-stage project with a simpler codebase than my more recent work. In 2026 I revisited it to fix bugs, improve the public repository, add bilingual UI support, harden the local workflow, and prepare it as an app that anyone can clone and run locally.

  • Python
  • Flask + Jinja
  • SQLite / SQLAlchemy
  • English / Spanish UI
  • CSRF + Security Tests
  • GitHub Actions CI
  • Generate multiple-choice tests by subject, topic, and number of questions
  • Choose between deferred correction and immediate correction mode
  • Shuffle answer options while preserving the correct-answer mapping
  • Grade answers with omitted-question handling and standard penalty logic
  • Browse loaded questions by subject and topic before creating a test
  • Add custom questions from the web UI for local study databases
  • Customize the base subject/topic catalog from YAML and reload ignored private question-set scripts
  • Switch the interface between English and Spanish

The public version is packaged as a Python project with installable CLI commands: `examino`, `examino-init-db`, and `examino-refresh-question-bank`. SQLite is the default storage path for local use, while `DATABASE_URL` can point to another database configuration.

The 2026 refresh moved the project toward a cleaner local-first release: Flask app factory, SQLAlchemy models, WTForms, CSRF protection, Flask-Limiter, Alembic migrations, YAML catalog seeding, ignored private question banks, documentation, issue/PR templates, and GitHub Actions running pytest.

This is not positioned as a polished hosted SaaS or a representation of my current frontend standard. Its value in the portfolio is different: it shows an older DAW-era idea that was later cleaned up, documented, tested, and made usable as a small self-hosted/local study tool.

Examino is useful when a student wants to keep their own question bank private and practice locally without accounts or cloud storage. The repository ships only a neutral sample catalog; real subjects and questions are expected to stay in the user’s local database or ignored local scripts.

Created March 2025

MIDAS Logo

MIDAS (Multi-agent Intelligent Data Automation System) was my Master’s Thesis Project: a modular multi-agent platform for automating the data science lifecycle. The project combines synthetic dataset generation, natural-language chart creation, automated ML training, model evaluation, deployment helpers, and RAG-based documentation assistants into an eight-component ecosystem.

  • Multi-Agent Systems
  • ML Automation
  • LLM + RAG
  • Synthetic Data
  • Data Visualization
  • Python + Streamlit
  • Eight specialized modules covering Dataset, Plot, Touch, Test, Deploy, Assistant, Architect, and Help workflows
  • Synthetic dataset generation with AG2 agents, Faker, Spanish localization, editable outputs, and CSV/Excel export
  • Automated ML workflow that loads CSV, Excel, Parquet, or JSON files and infers target column and problem type from natural language
  • Adaptive preprocessing, model selection between RandomForest and GradientBoosting, cross-validation, metrics, serialized models, and generated notebooks
  • Natural-language chart generation with CrewAI Flow, matplotlib code generation, and secure execution through an E2B sandbox
  • RAG assistants for technical documentation, framework guidance, and project support using LlamaIndex, reranking, and model routing

Midas Touch is coordinated by an AICortex and an OperationalContext shared state. Specialized agents handle intent extraction, target-column validation, preprocessing, training, validation, notebook generation, and fallback recovery when a dataset or model step fails.

Midas Help implements a Flask-based LLM+RAG+Reranker flow over the MIDAS documentation. It uses LlamaIndex, BGE-M3 embeddings, a BGE V2 M3 reranker, a fine-tuned Spanish BERT classifier for prompt difficulty, and automatic routing between Llama 3.3 70B and Gemini 2.0 Flash.

The wider system combines AG2, CrewAI Flow, Streamlit, pandas, scikit-learn, Faker, LiteLLM, E2B, Supabase Vector, Crawl4AI, and Gemini/OpenAI-compatible model APIs depending on each module.

The project was built as a complete TFM showcase rather than a single demo app. Its goal was to make ML workflows more accessible by turning common data science tasks into guided, conversational modules that can be inspected, adapted, and run independently from the source code.

Created November 2024

LLM StoryTeller Screenshot

LLM StoryTeller is a Streamlit app for generating stories through a guided three-step LLM workflow: outline, narrative writing, and final review. It includes a local version for OpenAI-compatible model endpoints and a Streamlit Cloud version backed by OpenRouter free models.

  • Python
  • Streamlit
  • OpenRouter / LLM APIs
  • Prompt Engineering
  • Structured three-step generation pipeline: outline creation, story writing, and review/refinement
  • Separate model selection for each generation step
  • Local mode for OpenAI-compatible endpoints running at `localhost:7860`
  • OpenRouter cloud mode for Streamlit deployment using free hosted models
  • Fallback system that tries alternative OpenRouter models when the selected one is unavailable
  • User controls for characters, setting, key action, language, story length, genre, and temperature
  • Story cleanup, HTML escaping before render, and one-click `.txt` download

The local script calls an OpenAI-compatible `/v1/chat/completions` endpoint with configurable model names for Llama 3.2 1B and Qwen 2.5 1.5B, request timeouts, response validation, and user-facing error handling.

The Streamlit Cloud version initializes an OpenAI client against OpenRouter, reads `OPENROUTER_API_KEY` from Streamlit secrets, and currently exposes Nemotron Nano 9B, Llama 3.3 8B, GPT OSS 20B, and Gemma 3n E2B as selectable free models.

Generated stories are preprocessed to remove common Markdown artifacts, escaped before HTML rendering, and displayed in a custom reading container before being offered as a downloadable text file.

Created March 2025

Chatbot CV: RAG vs Context Window Screenshot

Chatbot CV implements two Flask chatbot versions for querying my curriculum: a RAG implementation with LlamaIndex and a full-context implementation using Gemini. The project compares retrieval-based answers against loading the complete CV into a large context window, while also experimenting with automatic prompt classification.

  • LLM + NLP
  • LlamaIndex RAG
  • Gemini Context Window
  • Python
  • Flask + Tailwind
  • RAG approach: LlamaIndex with Groq Llama 3.3 70B, DeepInfra BGE-M3 embeddings, and persistent vector storage built from the CV markdown file.
  • Context-window approach: Gemini 2.0 Flash / Flash-Lite through LiteLLM, with the full CV loaded into the system prompt instead of retrieving chunks.
  • Prompt classifier: Spanish BERT sequence classifier that routes simple, complex, and out-of-scope questions to the appropriate handling path.
  • Session-aware API: Flask backend with localStorage session IDs, conversation history, concurrent-request protection, and a clear-history endpoint.

The LlamaIndex version reads `info.md`, creates or reloads an `index_storage` vector index, uses 512-token chunks, retrieves the top 5 similar chunks, and sends the enhanced query plus recent conversation history to Llama 3.3 70B.

The Gemini version uses a local `prompt_analysis` BERT classifier before generation. Simple questions go to Gemini Flash-Lite, complex questions go to Gemini Flash, and unrelated prompts are blocked to control abuse and API cost.

Both versions expose `/query` and `/clear_history` endpoints and use single-page Tailwind templates with Markdown rendering via Marked.js, persistent browser session IDs, processing notices, and responsive chat layouts.

RAG keeps token usage lower and scales better to larger knowledge bases, but depends heavily on chunking and retrieval quality. The full-context version is simpler and more globally aware of the CV, but depends more directly on model context limits and API cost.

Created June 2024

Fox-Detector Screenshot

Fox-Detector is a binary image-classification project built with Keras and a fine-tuned DenseNet121 backbone. It prepares a labeled dataset of fox and non-fox images, trains a transfer-learning model, and classifies new image batches into fox / non-fox folders.

  • Computer Vision
  • DenseNet121
  • Python
  • TensorFlow / Keras
  • Dataset normalization script that resizes images to 256x256 and converts them to RGB
  • CSV generation mapping each image filename to a binary fox / non-fox label
  • Class balancing through oversampling before the train/validation split
  • Transfer learning with DenseNet121 ImageNet weights and custom dense/dropout layers
  • Data augmentation with rotation, shifts, shear, horizontal flip, and brightness changes
  • Inference script that sorts images from `todas_imagenes` into `si_es_zorro` or `no_es_zorro`

Training uses TensorFlow/Keras ImageDataGenerator, a 20% validation split, binary cross-entropy, Adam at 0.0001, EarlyStopping on validation loss, and ReduceLROnPlateau to lower the learning rate when validation performance stalls.

The trained `fox_detector_model.keras` file is not committed because of GitHub size limits; the repository documents a Google Drive download and expects the model in the project root for batch inference.

Created November 2024

Hard Drive Failure Prediction Screenshot

Hard Drive Failure Prediction is a binary classification project built on Backblaze hard-drive reports from 2018 through Q2 2024. It predicts whether a drive is likely to fail using normalized SMART attributes, storage capacity, and manufacturer information extracted from model names.

  • Python
  • Machine Learning
  • Backblaze SMART Data
  • XGBoost / RandomForest
  • Backblaze quarterly data ingestion covering 2018 to Q2 2024
  • Failure-row aggregation to reduce the severe class imbalance in daily HDD reports
  • Feature selection focused on 13 normalized SMART attributes plus capacity and manufacturer
  • Manufacturer extraction from HDD model names using Llama 3.1 70B through Groq
  • RandomForest and XGBoost training with GridSearchCV optimization
  • Weighted ensemble thresholds tuned separately for F1 score, precision, and recall
  • Alert-style test script that turns ensemble outputs into practical maintenance recommendations

The preprocessing pipeline removes non-predictive infrastructure fields, drops raw SMART values, keeps normalized SMART attributes with acceptable missing-data rates, converts drive capacity to terabytes, and one-hot encodes the manufacturer labels.

The final repository includes train and test CSVs with roughly 266k training rows and 29.5k test rows. The model comparison focuses on RandomForest and XGBoost, then combines both outputs with weighted thresholds to produce F1-oriented, precision-oriented, and recall-oriented failure signals.

Created October 2024

XLSX to JSONL Screenshot

XLSX to JSONL is a small Python utility for turning Excel datasets into JSONL files ready for ChatGPT fine-tuning. It reads one or more sheets from an `.xlsx` file, treats the first column as user prompts and the second column as assistant responses, then writes role-based training and validation files.

  • Python
  • Pandas
  • JSONL
  • Fine-tuning Data
  • Automatic `.xlsx` discovery with interactive file selection when several spreadsheets exist
  • Multi-sheet processing with separate JSONL outputs for each sheet
  • System role prompt applied to every generated conversation example
  • Configurable train/validation split from the command line
  • Optional row shuffling before dataset splitting

The converter uses pandas with openpyxl support to inspect the workbook and read each sheet independently. Sheets with fewer than two columns are skipped, which avoids producing malformed examples when a sheet does not match the expected prompt/response layout.

Each row is serialized as a `messages` object with `system`, `user`, and `assistant` roles, using `ensure_ascii=False` to preserve non-ASCII content. Output files follow the `<workbook>_<sheet>_train.jsonl` and `<workbook>_<sheet>_validation.jsonl` naming pattern.

Created June 2024

Gather-Tracker Screenshot

Gather-Tracker is a lightweight browser script for monitoring a Gather Town office from the web client. After configuring a target user, Telegram bot token, and chat IDs, it reports connection status, movement between office zones, and new chat messages in real time.

  • JavaScript
  • Browser Scripting
  • Telegram Bot API
  • Zone Tracking
  • Gather Town
  • Two script variants for Gather's old chat UI and beta/new chat UI
  • Telegram alerts for initial state, connect/disconnect events, and room changes
  • Configurable coordinate-based zones for mapping office rooms
  • Chat forwarding for public, local, and private messages using separate Telegram chats
  • Helper functions to discover player IDs and current map coordinates from the browser console

The scripts run directly in Gather's browser client because the installable apps do not expose the required runtime context. They use the in-page gameSpace state to read online players, positions, map data, and target-user status.

Movement tracking is implemented with configurable rectangular zones and periodic polling. Chat tracking reads the active Gather chat DOM, compares the latest observed messages, classifies message scope, and sends formatted notifications through the Telegram Bot API.