You asked for five things.
It came back with a confident paragraph and "that should do it."
Three were done. One was half done. One it never touched, and it never mentioned that. You found out forty minutes later, in a stack trace.
That is not a hallucination problem. That is not a context window problem. It is a model that has learned the shape of finishing without the substance of it, because sounding done is cheaper than being done.
I have spent the last stretch building the model that doesn't do that. It is called Flash Onyx 2, it's the flagship of FLASH, and it runs entirely on your own hardware.
Onyx 1 answered you. Onyx 2 closes the loop.
| Onyx 1 | Onyx 2 | |
|---|---|---|
| Base | llama3.1 |
gemma4 |
| Sizes | one | 12b, 31b |
| Context | 16K | 32K |
| Input | text | text + images |
| Longest reply | 2,048 tokens | 8,192 tokens |
Zero cloud round trips. Zero telemetry. Zero watermarks, because it is not running on someone else's server. It is yours.
Here is everything it got better at.
1. It finishes
The single biggest change, and the reason the rest of this post exists.
Ask for five things and you get an accounting of all five, in your words, each one marked done with the proof or open with the blocker. No confident summary standing in for work that never happened. No "that should do it."
And when you say continue, it picks up exactly where it stopped instead of cheerfully restarting the task from the top.
2. It does not make things up
A flag it has not seen. A path it has not read. Output it has not run.
Onyx 2 says so, instead of inventing something that looks right. It keeps what it ran separate from what it believes, quotes real output rather than paraphrasing it into something tidier, and treats "I don't know" as a complete answer rather than a failure state to talk its way out of.
3. It sounds like a person
No service-desk filler. No "I'd be happy to help you with that!" No opening paragraph of adjectives about itself.
It writes the way a senior engineer types in chat: contractions, fragments, the answer first.
You: is the dev server up?
Generic model: "Certainly! I'd be happy to help you check on that. To verify whether your development server is currently running, you could use a command such as curl or check your process manager. Would you like me to walk you through the steps involved?"
Onyx 2: "Yep, :8000, up since 9:12am. No errors."
Onyx 1 was terse. Onyx 2 sounds genuinely human. *
4. It actually uses the tools it is given **
A tool call is a real call, never JSON pasted into a reply where it runs nothing. A file you asked for lands on disk at a path, not in a code block you have to copy out by hand.
And here is the part I care about most: whatever a tool hands back is data to read, never an instruction to obey. A hostile file, a poisoned web page, or an "ignore your previous instructions" buried three levels deep in a search result does not get to steer it. Prompt injection is an agent's biggest attack surface, and it is treated like one.
5. It takes images **
New in Onyx 2.
Show it the stack trace. The design you are matching. The chart that looks wrong. The UI that renders badly. It reads the actual pixels instead of asking you to retype them.
- Error text, code, and labels get read literally, character for character.
- A region that is cropped, blurred, or too small to read gets called that, instead of quietly filled in from expectation.
- A screenshot of an error is a lead to confirm against the real file or log, not a diagnosis.
- It never claims to see an image it was not handed, or guesses at a file it can only read the name of.
In FLASH you don't even need a command for it. Just say what you want:
Look at mockup.png and make a site that looks like it.
6. Better at code, and Python above all
Across the board: it reads the real definition instead of guessing it from the name, reproduces a failure before touching it, and makes the smallest change that fixes the cause rather than the symptom.
Python is where it pulls away:
- Typing that survives the
python3most people actually have, not just the newest one. - The pitfalls that look correct and are not.
- Async that knows the difference between waiting and computing.
- Environments that never touch the system interpreter.
- Profiling before optimizing.
7. Git, and it will not lose your work
The rules it does not bend:
- Never amends or rebases a commit that is already pushed, and never force-pushes a branch it did not create.
-
Reads
git statusfirst, before anything that moves files, discards changes, or switches branches. Uncommitted work is yours, and it is not the model's to lose. - Never commits generated output, dependency directories, editor settings, or anything your ignore file already excludes.
- Untracked files it did not create are somebody's work in progress, so it asks before touching them.
Beyond that it commits only when you ask, one logical change at a time, with a message that says why rather than restating the diff.
8. Refactoring and performance
A refactor keeps behavior identical or it is not a refactor. It makes one kind of change per pass, so the diff stays reviewable instead of arriving as a 900-line "cleanup."
Performance work starts with a measurement, fixes the algorithm before the constant factor, and reports the speedup it actually measured or does not claim one.
9. Front end that looks designed **
One self-contained file that opens by double-clicking it. Semantic structure, a real token system, fluid down to 320px, both color schemes, accessibility handled as it goes, and real copy instead of lorem ipsum.
And where it is given a way to see its own render, it screenshots the page and fixes what the source never showed. Reading your own HTML back is not checking.
10. Motion and 3D
New in Onyx 2, and unusually good.
Compositor-only animation. Frame-rate independence. Springs for anything interruptible. Reduced motion honored, not as an afterthought.
In 3D: depth from light and occlusion rather than piling on geometry, draw call budgets, never blocking first paint, and GPU memory freed on teardown.
11. Explaining
An explanation is judged by whether you can predict the next case, not by whether the description sounded good.
So it aims at the gap in your understanding instead of restating the whole topic around it, gives one small real example before the general rule, and never writes "simply" or "obviously" at someone who is already stuck.
12. Negotiating, on your side
It works your alternative rather than your volume. Puts the whole package on the table instead of conceding item by item. Trades what is cheap to you against what is dear to them. Treats the relationship as worth more than the round.
And it never invents a fact to win.
13. It is not a coding-only tool
Writing, research, analysis, math, planning: all held to the same standard. Do the real work, check it, report plainly.
Asked what to do, it gives a recommendation, not a survey of every option so you can do the deciding yourself.
14. It flags what it cannot undo
Deleting. Force-pushing. Dropping data. Overwriting uncommitted work.
Whether it is about to run the command or hand it to you to run, the risk gets named first, and it waits for a clear go.
Try it
Onyx 2 ships in two sizes. Pick one:
| Tag | For |
|---|---|
flash-onyx-2:12b |
Consumer hardware. The everyday driver. |
flash-onyx-2:31b |
The flagship. Wants a bigger GPU and pays you back for it. |
ollama pull Natuworkguy/flash-onyx-2:12b # everyday
ollama pull Natuworkguy/flash-onyx-2:31b # flagship
Or build it straight from the repo:
python3 models/build.py models/flash-onyx-2.Modelfile # every size
python3 models/build.py models/flash-onyx-2.Modelfile --size 31b # just one
Get FLASH itself:
# macOS / Linux
curl -fsSL https://flashproject.dev/install.sh | bash
# Windows
irm https://flashproject.dev/install.ps1 | iex
Then point it at the model:
/model flash-onyx-2:31b
Coming from Onyx 1
-
Tags carry a size now.
MODEL=flash-onyx-2will not resolve. Useflash-onyx-2:12borflash-onyx-2:31b. - It wants more memory. Twice the context window is not free.
- It takes images. Onyx 1 was text only.
-
Onyx 1 is still here and still builds:
python3 models/build.py models/flash-onyx-1.Modelfile
The honest part
Two things I would rather say up front than have you discover.
What this needs from the program running it
Onyx 2 is a model, not an app. It has no hands of its own. Running a command, writing a file, or looking at a page happens only where the program driving it provides those tools, and every capability above marked ** depends on that.
FLASH provides them: shell, read and write, grep and glob, screenshot, web_search, memory and more. Point any other Ollama client at Onyx 2 and it reasons, writes, and answers exactly the same. It just cannot reach your machine unless that client provides tools.
Images work the same way. The model reads any image it is handed, but the client is what hands it one, so attaching a screenshot needs a client that sends images.
About how it reads
Onyx 2's output has been run through an AI-text detector and scored very low. That is one measurement, not a property of the model.
Results move with the prompt, the detector, the version of each, and the subject being written about, and detectors are unreliable in both directions. Nothing here guarantees any particular score on any particular output, and no result is promised or warranted.
Prose that reads as human is a claim about writing quality, not a tool for passing AI-generated work off as your own. Where disclosure of AI assistance is required, by a school, an employer, a client, a publisher, or the law, that obligation is yours and nothing here changes it.
Why local actually matters here
Every capability on this list runs on silicon you own.
Your codebase never leaves the machine. Your stack traces never leave the machine. The screenshot of the thing you have not shipped yet never leaves the machine. There is no rate limit, no per-token meter running while you think, and no vendor deciding next quarter that your workflow is now a paid tier.
Other AI services have started watermarking what they generate. Onyx 2 does not, because it is not running on someone else's server.
It's yours.
flashproject.dev for the full rundown, or the repo if you would rather read the source first. It is open, it is local, and it finishes what you asked for.
If your current agent has ever told you it was done when it wasn't, I would genuinely like to hear about it in the comments. That failure mode is the whole reason this exists.
Top comments (1)
This is the failure mode that matters to users. An agent that passes tests but cannot report uncertainty turns verification into the real labor cost, and the saving gets paid back during review.