Back to case studies

Case Study 02 · Full-Stack · Active

FleetForge

A browser-based studio for building, testing and running web data-collection jobs. A local language model suggests page selectors, and each suggestion is checked before use.

RoleSole author: architecture, back end, front end and the LLM integration

Problem

Every new data source usually means another bespoke scraper, with the same orchestration bugs written again. The slowest step is not even the code: it is a person picking CSS and XPath selectors off a page by hand.

Solution

Scrapers became configuration: a blueprint is JSON run by a shared engine, authored in a visual wizard that loads the target page into a safe embedded render so selectors can be picked by eye. A self-hosted language model proposes a selector for each named role, and each proposal is checked against the page before it is accepted. Celery runs the resulting missions under a concurrency cap with managed browser lifecycles.

Highlights

  • Compresses the page before prompting: drops scripts, styles, SVG and other non-content tags, keeps a short attribute allowlist and caps data attributes per element, so a real page fits in a usable prompt.
  • Model output is never trusted as-is: suggestions are validated against the page for a fixed set of named roles.
  • The LLM client uses only the standard library and speaks an OpenAI-compatible API, so it works with Ollama or vLLM without new dependencies.
  • Requests use JSON mode at low temperature, retry once with backoff, and raise typed errors for a malformed reply or a missing provider.
  • Separate unit, integration and end-to-end suites, including browser lifecycle under concurrency, with every dependency pinned exactly.

Outcome

Adding a source stopped requiring Python. The LLM assist is a real feature: specified in a design document first, covered by tests, and switched off cleanly when no provider is configured.

How the Work Ran

Solo, run in numbered delivery phases that show in both the commit history and the stylesheet names. Conventional commit prefixes throughout. Design documents were written before the features they describe, including the selector-assist plan, and an architecture document lives next to the code.

Tech

  • Celery
  • Ollama
  • Redis
  • Selenium
  • Django
  • Python
  • SASS