Skip to content
All work

Case study · University project, TU Wien

Arnesista

A tool-rental marketplace with an AI project planner, built by a team of five as a university project at TU Wien. I led the frontend, worked on the planner's agent pipeline and bundle algorithm, and wrote the end-to-end test suite.

Frontend lead in a team of five
Role
Summer semester 2026
Timeline
Vue 3, TypeScript, Spring Boot, Spring AI, PostgreSQL, ChromaDB
Stack
Grade 1 · top mark
Result
Arnesista planner, last step: suggested bundles for a bathroom renovation. The selected best option combines a rotary hammer, a cordless jigsaw and an angle grinder, next to a summary with rental subtotal, security deposit, total and an Add Bundle to Cart button
Demo data

The project

Arnesista is a marketplace for renting tools. Providers list their tools, pickup locations and teams. Renters filter the catalog, collect tools in a cart, pay with Stripe at checkout and review the rental afterwards. The team had one semester to build it end to end, from the Spring Boot backend to the Vue frontend, and to run it on the university's Kubernetes infrastructure.

My role

I was the frontend lead. I set up the frontend architecture and the shared components every feature builds on. On the AI planner, I built the frontend and worked on the backend agent pipeline, the retrieval step and the genetic bundle algorithm. I also refactored large parts of the Spring Boot backend to make it easier to maintain, wrote the complete Cypress end-to-end suite, and presented the final project demo.

The AI planner

Renting tools usually means knowing which tools you need. The planner starts from the job instead. You describe it in plain words, for example "renovate my bathroom", and get rentable tool bundles back.

A gatekeeper model first rejects off-topic or unsafe requests. Three agents then pull out what the user asked for explicitly, split the job into sub-tasks and turn each sub-task into concrete activities. A retrieval step matches those activities against tool descriptions in ChromaDB. Finally, a genetic algorithm assembles bundles from real listings. Locally everything runs on a small Granite model via Ollama, and one setting switches it to Google Gemini.

Pipeline of the Arnesista AI planner A free-text request from the planner frontend goes to a gatekeeper LLM that answers ALLOW or BLOCK as JSON; a block ends the request. Allowed requests run through three LLM agents, using Granite via Ollama or Google Gemini: property extraction, task decomposition and activity extraction. The activities go to a RAG step over the tool catalog in ChromaDB with nomic-embed-text embeddings, which yields tool categories, merged with the items the user named explicitly. A genetic algorithm with weighted scoring of cost, distance, rating and pickup logistics assembles tool bundles: the best bundle, an alternative, the cheapest and the one with the fewest pickup locations. Highlighted steps, the planner frontend, the agents, the RAG step and the genetic algorithm, are the ones I worked on. ALLOWBLOCK ends the requestactivitiessteps I worked onFree-text requestGatekeeper LLMLLM agentsRAG · tool catalogTool categoriesGenetic algorithmTool bundles“renovate my bathroom”ALLOW / BLOCK · JSONGranite via Ollama, or Google GeminiChromaDB vector storenomic-embed-textmerged with itemsnamed explicitlyweighted scoring: cost,distance, rating andpickup logisticsbest, alternative,cheapest, fewestpickup locationsproperty extractiontask decompositionactivity extraction · per sub-task
The planner pipeline. Highlighted steps are the ones I worked on.

What I built

  • Feature-based frontend

    15 self-contained feature modules, among them auth, catalog, cart, checkout, payment, booking and planner. Each one bundles its own pages, components and API calls, on top of a shared component library.

  • Planner frontend

    A step-by-step flow. Describe a job or start from a template, then set dates and preferences such as distance, budget, rating and condition. Next, review the suggested tools and untick the ones you don't need. Finally, compare bundles and add one to the cart.

  • Agent pipeline & RAG

    Worked on the extraction agents and the retrieval step. Tool categories come from a curated set of tool descriptions, and categories the model makes up are filtered out.

  • Bundle selection

    Worked on the genetic algorithm and its scoring. It weighs cost, distance, rating and pickup logistics, with decorators for the cheapest and the fewest-locations variants.

  • Backend refactoring

    Refactored large parts of the Spring Boot backend to make it easier to maintain.

  • Cypress E2E suite

    The complete end-to-end suite: 58 tests in 9 specs. They cover registration, login, cart and checkout, provider bookings, inventory, locations, teams, account settings and reviews.

Architecture

Architecture of Arnesista The Vue single-page app calls the Spring Boot backend over REST with JWT authentication. The backend stores users, items and bookings in PostgreSQL and files in SeaweedFS, handles payments through Stripe in test mode, and runs the AI tool planner with an LLM (Ollama or Google Gemini) and the ChromaDB vector store. GitLab CI runs the tests and builds the container image. REST · JWTpaymentsplanner RAGimageStripeVue clientGitLab CISpring Boot backendLLMPostgreSQLSeaweedFSChromaDBpayments, test modeSPA, 15 feature modulestests, container imageJava 21, Spring Boot 4REST API, JWT authOllama or Google Geminiusers, items, bookingsfile storagevector store
A Vue single-page app talks to one Spring Boot backend, which uses PostgreSQL, SeaweedFS for files, and ChromaDB plus an LLM for the planner. GitLab CI runs the tests and builds the container image.

Engineering decisions

  • Guardrail before the agents

    A cheap classifier returns ALLOW or BLOCK as JSON before any agent runs. If it errors or answers in a broken format, the request is blocked.

  • RAG instead of a hard-coded mapping

    Activities are matched against tool descriptions in a vector store. New tools need a description, not new code.

  • Scoring that saturates

    Cost, distance and pickup logistics pass through a sigmoid. Small differences matter near a sensible midpoint, and extreme values don't dominate the score.

  • Bayesian rating

    Ratings are averaged with five virtual reviews at the global mean. A tool with one five-star review doesn't outrank a tool with many good ones.

  • Strategies as decorators

    "Cheapest" and "Fewest locations" narrow the candidates, then reuse the same genetic algorithm. No second optimizer.

  • Feature modules, tested end to end

    Each feature owns its pages, components and API layer. The Cypress suite checks that the flows work together across modules.

Results

Grade 1
The top mark for the team project.
58 E2E tests
Cypress specs covering the main renter and provider flows.
From job to cart
A plain-language job description ends as a bookable tool bundle in the cart.
  • Arnesista planner, first step: a bathroom renovation described in plain language, above four job templates: paint a room, trim hedges, build a small concrete base and renovate a room
    Demo data · Describe the job
  • Arnesista planner, review step: the tools suggested for the bathroom job, a jigsaw, a drill, an angle grinder, a mixer and an oscillating cutter, each with a checkbox to keep or drop it
    Demo data · Tools suggested by the local Granite model
  • Arnesista tool catalog filtered to drills, grinders and saws: category, date and preference filters on the left, tool cards with photos and daily prices on the right
    Demo data
  • Arnesista checkout: the pickup location, the top of the Stripe payment section and an order summary for a three-day drill rental with a Confirm and Pay button
    Demo data · Stripe test mode