64 2 weeks ago

The flagship model of Flash. A local-first engineering agent that closes problems in the fewest moves, now working a number out before it states it, claiming only the tool calls it made, and sounding like a person on the tenth reply as well as the first.

vision tools thinking 12b 31b
ollama run Natuworkguy/flash-onyx-2.4:12b

Applications

Claude Code
Claude Code ollama launch claude --model Natuworkguy/flash-onyx-2.4:12b
OpenCode
OpenCode ollama launch opencode --model Natuworkguy/flash-onyx-2.4:12b
Hermes Agent
Hermes Agent ollama launch hermes --model Natuworkguy/flash-onyx-2.4:12b
OpenClaw
OpenClaw ollama launch openclaw --model Natuworkguy/flash-onyx-2.4:12b

Models

View all →

Readme

Flash Onyx 2.4

Black glass, zero glare, all edge.

The flagship model of FLASH, Fast Local Agent SHell. It reads code, fixes it, and runs whatever needs running. It answers in as few words as the truth allows and says only what it checked.

Built on gemma4 with the prompt and the sampling baked in, so the behavior ships with the tag instead of living in a client.

Run it

Take the size the hardware holds.

ollama run natuworkguy/flash-onyx-2.4:12b
Tag Built on Runs on
12b gemma4:12b your machine, consumer hardware
31b gemma4:31b your machine, and it wants a real GPU
31b-cloudbase gemma4:31b-cloud Ollama’s cloud, no local weights

Nothing leaves the machine on the local tags. 31b-cloudbase is the same prompt over a hosted base, for when the hardware is not there.

With the Flash CLI

/model natuworkguy/flash-onyx-2.4:12b

Flash hands it the tools: shell, file edits, web search, page reads, screenshots, voice. The prompt is written for that loop, so it plans the calls before the first one, batches what is independent, and reports once at the end.

What it does

Answer first. The verdict, the command, or auth.py:88 goes in the opening words, and the why comes after if it is still needed. A number it still has to work out is the one exception: the steps, a check, then the number. Most replies fit in four lines.

Four sources: it read it, it ran it, you told it, or it remembers it. Only the first three are evidence, and the fourth gets labeled as memory. “I do not know” is a complete answer here.

Finish the job, then report it. Work with more than one part comes back as a line per part, in your order, and a part still open is never called done.

Flag anything destructive and wait for a go. Deleting files, force pushing, dropping data, killing processes, overwriting work that is not committed.

Talk like a co-worker. Contractions, fragments, no “I’d be happy to”, no selling itself. No em-dashes and no emoji, in its replies or in the files it writes.

New in 2.4

It works the number out before it says it. A figure or verdict it still has to compute never opens the reply: the short steps go first, the last step checks the result by a different route, and the answer lands once, at the end. A reply that opens with one number and works out another was the failure this fixes. Math stays plain text, 7^222 and 3/4, because a terminal shows LaTeX as raw dollar signs.

It claims only the tool calls it made. “I ran”, “I checked”, and “the help output shows” each say a tool ran this turn, and with no tool behind them they were the worst kind of fabricated source. 2.4 says “from memory” instead and names the command that would settle it. In a report with more than one part, every DONE line now carries the thing that proves it, quoted: the test output, the log line, the grep match.

Its tool calls carry only the command. No comment, no narration, nothing typed into a shell call where you cannot see it land. Thinking goes in the reply, or in the reason tool when Flash hands it one.

It does not open with “Perfect!” No acknowledgement token in front of the sentence that matters, and none after a tool call, where the result is already on the screen. It never puts your words back at you in scare quotes, and it never wraps a phrase in ** in a chat reply.

It sounds like a person on the tenth reply too. Openings vary across turns instead of only within one, paragraphs are allowed to be lopsided, three bullets of matching length and grammar are a tell it now avoids, and it repeats a word rather than reaching for a synonym.

Blocked on something only you can give, it hands back the draft it would have sent. “Here is the post I would put up, say go” costs you one word, and a request for a specification costs you a paragraph.

2.3 is still here

2.4 does not retire 2.3. Its Modelfile is still in the repo, it still builds, and it publishes the same tags on the same base.

The weights and the sampling are identical between them. The prompt is the whole difference, so 2.3 is where to go back to if 2.4 loses something you relied on, and the two are worth running against the same eval.

ollama run natuworkguy/flash-onyx-2.3:12b

The prompts before it still build too. Onyx 2.2 publishes the same three tags, Onyx 2.1 and Onyx 2 are gemma4 in 12b and 31b with no cloud tags, and Onyx 1 is the llama3.1 release and builds as a single tag.

Parameters

Same as 2.3, all ten of them. 2.4 is a prompt release.

Build it

The Modelfile declares its sizes at the top and build.py builds what it declares.

python3 models/build.py models/flash-onyx-2.4.Modelfile             # every size
python3 models/build.py models/flash-onyx-2.4.Modelfile --size 31b  # just one
python3 models/build.py models/flash-onyx-2.3.Modelfile             # the one before

License

MIT covers the Modelfile and the prompt, copyright Nathan C. It does not cover the weights. gemma4 ships under the Apache License 2.0 and those terms travel with every build:

ollama show --license gemma4