---
title: 'Why Mullet doesn’t use FreeLLMAPI'
url: 'https://www.dealmobile.co.uk/writing/why-mullet-doesnt-use-freellmapi'
type: Post
published: '2026-10-25'
summary: 'FreeLLMAPI puts dozens of free LLM tiers behind one endpoint, and it is a good tool for what it says it is for. Mullet 2 needs to know which model did each step and whose terms apply to my code, so it uses one named OpenRouter free model, for public repos only, instead. That rung hasn’t run yet.'
---

# Why Mullet doesn’t use FreeLLMAPI

Published 2026-10-25

![Two paths to a free model: one router choosing among many providers, and Mullet choosing one OpenRouter free model for public repos only, with the same gates either way.](https://www.dealmobile.co.uk/sites/default/files/styles/almanac_shot_md/public/content/images/posts/why-mullet-doesnt-use-freellmapi/hero.png.webp?itok=sR2VGMAi)

When I started on the [delegation ladder](https://www.dealmobile.co.uk/writing/the-delegation-ladder.md), the obvious way to get free models was [FreeLLMAPI](https://github.com/tashfeenahmed/freellmapi). It is a small self-hosted server that takes your keys for a few dozen free tiers (Google, Groq, Cerebras, Mistral, OpenRouter, Cloudflare and more) and puts them all behind one OpenAI-compatible `/v1` endpoint. A router picks a model for each request, moves to the next provider when one hits its rate limit, and keeps every key under its cap. Your keys are stored encrypted, and your apps only ever see one token.

I read the code, the docs and the terms of the providers it uses, and decided not to build on it. This post is why, and what Mullet does instead. None of it is a complaint about the project. It is MIT licensed, clearly written, and honest about itself: the README says it is “for personal experimentation and learning, not production”. Mullet’s jobs run on my real repos, some of them private, which is a different use.

## Mullet has to know who did the work

The whole point of [Mullet 2](https://www.dealmobile.co.uk/writing/mullet-2-coding-jobs-you-can-leave-running.md) is evidence. Every step of a job passes or fails on checks Mullet runs itself, and the report says which worker did each attempt, on which model, for how much. `mullet ladder report` shows which models keep failing which kinds of step, so I can move them off the ladder.

A router that chooses the provider for each request works against that. The same request can land on a different provider, or a different model, from one call to the next, and a long job makes hundreds of calls. When an attempt fails, I want to know whether the model was wrong or the provider was. When a step is retried in the same session, it needs to be the same model that started it. FreeLLMAPI is built to hide those differences, which is exactly what you want for a hobby app and exactly what I don’t want here.

## Whose terms apply to my code

Each free tier has its own terms, and they still apply when traffic goes through a proxy. FreeLLMAPI’s README says so itself. Some free tiers may use what you send them to improve their models, or let people review it. Its own provider guide marks several providers as ones to be careful with, and one as one to avoid. Some of the routes are small relays in front of other people’s models.

For a public repo that is fine: the code is already public. For a private repo, or any code that isn’t mine to share, it is not, and “the router picked a provider whose terms I hadn’t read” is not a risk I can take on behalf of a job I’ve left running overnight. Pooling several accounts at one provider to get more free quota also sits badly with most of those terms.

## Free quota runs out in the middle of a job

Free tiers have daily caps. A router handles that by falling back to whatever is left, which means the best models are used up first and quality drops as the day goes on, until the caps reset. A Mullet job can run for hours. A step that passed at 9pm on a good model can be retried at 2am on a much weaker one, and from the outside it looks like the same rung.

## What Mullet does instead

The free rung is one OpenRouter `:free` model, named in my config, on the OpenRouter key I already have. It is only offered for repos that GitHub confirms are public, checked when the step starts, so private code never goes to a free tier. Its attempts run in the same sandbox, through the same key proxy, and face the same gates as every other worker.

The rest of the ladder is local and paid models, all chosen by name:

- **Local**: a model in LM Studio on my laptop, for any repo, because nothing leaves the machine.
- **Kimi**: Moonshot’s own API, paid per token.
- **OpenRouter**: paid models, and every request now asks OpenRouter for hosts that don’t keep prompts and aren’t serving a cut-down 4-bit copy of the model.
- **Claude**: my own Claude Code, last.

One key, one set of terms per rung, and a report that says exactly which model did what.

## How it is going

Honestly: the free rung hasn’t proved itself yet. Mullet’s own repo is private, so none of the first jobs could use it, and I haven’t measured it on a public repo. The [ladder post](https://www.dealmobile.co.uk/writing/the-delegation-ladder.md) has the figures from the paid and local rungs, and I’ll add the free rung’s once there are some.

If you want a single endpoint for free models on a side project, FreeLLMAPI is worth a look. If you want to leave a coding agent running on code that matters, choose each model yourself and check its work.

- **Products:** [Mullet](https://www.dealmobile.co.uk/products/mullet.md)
- **Tags:** [Python](https://www.dealmobile.co.uk/writing/tag/python.md), [AI](https://www.dealmobile.co.uk/writing/tag/ai.md)

---

Index of this site: [llms.txt](https://www.dealmobile.co.uk/llms.txt)
