v0.9.0
[0.9.0] - 2026-03-15
Added
-
Multi-Model support —
ModelRegistryloads and serves multiple models simultaneously
with LRU eviction.- New
src/model_registry.rs:ModelRegistry,EngineEntry,RegistryConfig. GET /api/psnow lists all currently-loaded models (previously only the one model).GET /v1/modelsnow lists all.gguffiles inmodels_dir(not just the loaded one).- Each inference/embedding request is routed to the correct engine based on the
modelfield;
unknown models return HTTP 404. DELETE /api/deletenow also unloads the model from the registry if it was loaded.
- New
-
--max-modelsflag (FOX_MAX_MODELSenv var, default1) — maximum number of models
kept in memory simultaneously; excess models are evicted LRU-first. -
--alias-fileflag (FOX_ALIAS_FILEenv var) — optional TOML file mapping short names
to model stems (e.g."llama3" = "Llama-3.2-3B-Instruct-f16").
Default path:~/.config/ferrumox/aliases.toml.
Changed
AppStatereplacesengine: Arc<InferenceEngine>withregistry: Arc<ModelRegistry>+
primary_model: String. Backward-compatible:fox serve --model-path X.ggufworks unchanged.router()signature updated accordingly.- Engine run-loop is now started inside
ModelRegistry::get_or_loadand aborted automatically
on LRU eviction viaDroponEngineEntry.
[0.8.0] - 2026-03-15
Added
-
Embeddings API — unlocks RAG pipelines (LangChain, LlamaIndex, Open WebUI RAG, etc.)
POST /v1/embeddings— OpenAI-compatible endpoint; acceptsinputas a string or array
of strings, returnsdata[].embeddingvectors.POST /api/embed— Ollama-compatible endpoint; returnsembeddings: [[f32]].InferenceEngine::embed()async method;Model::get_embeddings()+Model::embedding_dim()
trait methods with fullLlamaCppModelimplementation viallama_set_embeddings/
llama_get_embeddings_seqFFI and stub fallback.- New types:
EmbeddingInput(untagged enum for String/Vec),EmbeddingRequest,
EmbeddingObject,EmbeddingUsage,EmbeddingResponse,OllamaEmbedRequest,
OllamaEmbedResponse.
-
POST /api/pullwith SSE streaming — download models from HuggingFace Hub via the
server API, identical to Ollama's pull flow.- Emits newline-delimited JSON events:
pulling manifest→downloading(withdigest,
total,completedbytes) →verifying sha256 digest→success. - Automatically selects Q4_K_M quantization when available, otherwise picks the first GGUF.
- New
--hf-tokenflag onfox serve(alsoHF_TOKENenv var) forwarded to pulls. - New
AppState.hf_tokenfield; new filesrc/api/pull_handler.rs. - New types:
PullRequest,PullStatus.
- Emits newline-delimited JSON events:
-
Release binaries +
install.sh— one-command installation..github/workflows/release.yml— triggered onv*tags; builds for four targets:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,x86_64-apple-darwin,
aarch64-apple-darwin. Uploads tarballs as GitHub Release assets.install.sh— detects OS + arch, downloads the correct tarball, installs to
/usr/local/bin/fox(configurable via--prefix).fox.service— systemd unit for runningfox serveas a daemon.
Changed
Cargo.toml: version bumped to0.8.0.src/api/routes.rs:router()now takes an extrahf_token: Option<String>parameter.src/cli/serve.rs:ServeArgsgains--hf-token/HF_TOKEN.
[0.7.0] - 2026-03-14
Added
-
Ollama-compatible API layer (
src/api/routes.rs,src/api/types.rs)GET /api/tags— lists all.ggufmodels in~/.cache/ferrumox/models/with name,
size, SHA256 digest, architecture family, quantization level, andmodified_attimestamp.
Open WebUI and Continue.dev use this endpoint to discover available models.GET /api/ps— returns the currently loaded model with real file size (bytes) and
SHA256 digest looked up from disk.POST /api/show— returns detailed metadata for a named model: architecture family,
quantization, human-readable size, digest, modification date, and file path.DELETE /api/delete— removes a.gguffile from the models directory by model name
or filename. Returns404if the model is not found.- New response types:
OllamaModel,OllamaDetails,TagsResponse,PsEntry,
PsResponse,ShowRequest,ShowResponse,DeleteRequest. - SHA256 digest computed once per file via
sha2+hexand cached inAppState
(Arc<Mutex<HashMap<PathBuf, String>>>). Subsequent requests for the same file return
instantly. - New dependencies:
sha2 = "0.10",hex = "0.4".
-
models_diradded toAppState(src/api/routes.rs,src/cli/serve.rs)router()now accepts amodels_dir: PathBufparameter (default:
~/.cache/ferrumox/models) used by the Ollama-compat handlers.src/cli/show::parse_architectureandparse_quantizationpromoted topub(crate)
so they can be reused by the API layer without duplication.
Compatibility
With v0.7.0, Open WebUI and Continue.dev work out of the box by pointing their
Ollama URL to http://localhost:8080. No other configuration change is required.