Skip to content

Cadabra.app 2.0 beta 2

Pre-release
Pre-release

Choose a tag to compare

@abra-code abra-code released this 30 Aug 09:26
· 7 commits to main since this release

Requires: macOS 14.6 or later (Apple silicon)

Summary: This beta is about the first ten minutes with the app: finding a model, downloading one, and never
being handed a broken one.

First run opens the model download browser

Launching Cadabra with no model installed used to open the Local Models picker on an empty table,
with nothing on screen saying where models come from. Cadabra now checks whether any model is
installed and opens the Hugging Face browser instead when the answer is none - downloading a model
being the only useful move at that point. Closing that browser hands back to the model picker, so a
first run no longer ends with the download finished and no window on screen.

Apple's on-device foundation model does not count as installed for this check: it needs no download
and is present on every eligible Mac, so counting it would retire the first-run branch on exactly
the machines it exists for.

Launch and the picker now read the same list of folders when they scan for models, so the two can
no longer disagree about what "no models installed" means.

"Download Models" instead of "Browse Hugging Face"

Hugging Face is not a household name, and someone new to running local models has no reason to know
what it is. The entry points now say Download Models - in the main window and in the Local
Models picker - while the browser window itself still names Hugging Face as the source it is
searching ("Download Models - Hugging Face").

Interrupted downloads can no longer masquerade as models

Downloads used to be written straight to the model's final name. Any death the app could not clean
up after - a force quit, a kernel panic, a power cut - left a truncated file sitting at exactly the
name the model picker scans for. The picker listed it, showed its size, and handed it to a loader
that could only fail.

Every transfer now lands in a <final>.part staging file and is moved into place only once it is
complete and the size the server declared. A staging name matches neither the *.gguf scan nor the
MLX config.json / *.safetensors shape, so an interrupted download is invisible to the picker by
construction.

What this means in practice:

  • Interrupted downloads resume. Whatever arrived is kept, and the next Download continues from
    there rather than starting over. If the server refuses to resume, Cadabra spends that one attempt
    and restarts the file from the top.
  • Quitting mid-download no longer throws away the bytes. Quit used to delete the partial file,
    because leaving it meant a corrupt model in the picker on the next launch. It is safe to keep now,
    so however many gigabytes had arrived survive the quit.
  • Cancel still cleans up. Pressing Cancel removes the staging file and its bookkeeping sidecar.
  • An already-downloaded file is now checked by size. A local file that is not the length the
    server declares is no longer reported as cached - it is downloaded again. Pressing Download is
    what repairs a file a previous build left truncated.
  • Incomplete MLX model folders are detected. An MLX download interrupted between shards leaves
    config.json beside only some of its weights, which used to look like a whole model. When the
    folder has a model.safetensors.index.json, Cadabra now requires every shard that index names to
    be present before it will offer the model. Folders with no index are unchanged - there is nothing
    to be incomplete against.

Upgrading from 2.0b1

Drop the new Cadabra.app in place of the old one. Downloaded models, settings, and chat history are
untouched.

One thing worth knowing: a GGUF download that was interrupted under 2.0b1 or earlier may have
left a truncated .gguf file under its real name, and the picker still lists it as a model. If one
fails to load, download it again from the model browser - Cadabra compares what is on disk against
the size the server declares now, so a short file is re-fetched rather than reported as already
downloaded. No manual deletion needed. Incomplete MLX folders are caught by the new shard check
regardless of which version created them, and simply stop appearing in the picker.