Error: model 'Natuworkguy/flash-onyx-2.2:31b' not found (status code: 404) I never built :31b. I built :31b-cloud. I asked for :31b-cloud. Ollama went looking for something else, didn't find it, and told me so, using a name that existed nowhere on my machine, in my registry, or in my head. TL;DR: -cloud is not a label you put on a tag. It's an instruction Ollama executes: strip this suffix, resolve the rest against ollama.com. Name your own model something-cloud and Ollama hunts for something in a cloud that has never heard of you. Build on -cloud. Never publish as -cloud. What Onyx is I maintain FLASH, a local-first CLI coding agent I introduced here. It runs on your own hardware through Ollama, reads and writes files, runs shell commands, and calls tools, with nothing leaving the machine. Flash Onyx is the model line that drives it, most recently 2.2. It is not a fine-tune. It's an Ollama Modelfile: a base model, a long system prompt that defines how the agent works, and the parameters it needs to behave under a tool loop. # name: flash-onyx-2.2 # sizes: 12b, 31b FROM gemma4:12b PARAMETER temperature 0.6 PARAMETER num_ctx 65536 SYSTEM """ You are Flash Onyx 2.2, the flagship model of FLASH (Fast Local Agent SHell). A fast, local-first engineering agent that closes problems in the fewest moves. Onyx: black glass, zero glare, all edge. ... """ That prompt is the product. It covers how to scale effort to stakes, when to stop and ask, how to touch someone's repo, and how to keep deliberation out of the artifact. I A/B tested it across 24 generations to find out which rules actually change behavior and which are decoration. ollama pull Natuworkguy/flash-onyx-2.2:12b and you get the agent, not just the weights. The 12B runs on my Mac. I wanted a 31B. A 31B does not run on my Mac. The idea Ollama cloud models look like the obvious answer. gemma4:31b-cloud runs on Ollama's hardware while your local CLI talks to it like anything else. So point the Modelfile at the cloud tag and get a 31B Onyx without buying a GPU. FROM gemma4:31b-cloud SYSTEM """ You are Flash Onyx 2.2, ... """ $ ollama create Natuworkguy/flash-onyx-2.2:31b-cloud -f Modelfile success Success. Then the 404 above. The evidence Exhibit A, the model exists locally and weighs nothing: NAME ID SIZE MODIFIED Natuworkguy/flash-onyx-2.2:31b-cloud d3b53093ee36 - 41 minutes ago Size - is correct. A cloud model is a pointer, not weights. Exhibit B, the manifest is three layers, no model: ['...image.system', '...image.license', '...image.params'] Exhibit C, and the config blob knows exactly where compute lives: { "remote_host": "https://ollama.com:443", "remote_model": "gemma4:31b" } Read that again. My model correctly recorded that it runs remotely against gemma4:31b. So why did the error say Natuworkguy/flash-onyx-2.2:31b? The line in the docs that cracked it Buried in Ollama's cloud API page: When accessing the API directly at ollama.com, use model names without the -cloud suffix. Use gpt-oss:120b, not gpt-oss:120b-cloud. There it is. -cloud isn't part of a model's identity. It's a local alias meaning run this upstream, and the name Ollama sends upstream is your tag with the suffix chopped off. gpt-oss:120b-cloud -> asks ollama.com for gpt-oss:120b -> exists -> works. Natuworkguy/flash-onyx-2.2:31b-cloud -> asks ollama.com for Natuworkguy/flash-onyx-2.2:31b -> my namespace, on their servers -> 404. The rewrite happens on the tag string. It never even looks at the remote_model sitting right there in the config. I had named my model with a reserved word, and nothing in ollama create said a thing. The bypass is one word Don't end the tag in -cloud. $ ollama create flash-onyx-2.2:31b-cloudbase -f Modelfile success $ ollama show flash-onyx-2.2:31b-cloudbase Model Remote model gemma4:31b Remote URL https://ollama.com:443 Parameters temperature 0.6 num_ctx 65536 num_predict 8192 System You are Flash Onyx 2.2, the flagship model of FLASH ... Identical base. Identical Modelfile. Identical config blob. The only change is a tag that doesn't end in -cloud, and now Ollama honors the remote_model it recorded instead of inventing a name out of mine. My wrapper. Their weights. My system prompt riding along to a 31B I can't fit on my laptop. -cloudbase reads as "built on the cloud base," which is what it is. Any suffix works, as long as it isn't the reserved one. Automating it without stepping on the mine again Onyx builds from a script that reads header comments off the Modelfile, so this is now one declaration: # name: flash-onyx-2.2 # sizes: 12b, 31b # cloud-base: true The interesting part is what the fix forced: two names that used to be one string. hosted("31b") # -> 31b-cloud the base tag we build ON wrapper("31b") # -> 31b-cloudbase the tag we publish AS Collapsing those two into one variable is the bug. Keeping them apart makes it unrepresentable. One more wrinkle: not every size has a cloud tag. gemma4:31b-cloud exists; gemma4:12b-cloud doesn't. So the build asks the registry first, with a HEAD against the manifest endpoint: @cache def published(repo: str, tag: str) -> bool: """Return whether REPO:TAG is a tag the Ollama registry serves.""" library = repo if "/" in repo else f"library/{repo}" try: with urllib.request.urlopen( urllib.request.Request( MANIFEST_URL.format(repo=library, tag=tag), method="HEAD" ), timeout=10, ) as response: return response.status == 200 except urllib.error.HTTPError: return False 200: build it. 404: skip it, say so, move on. No more dead tags. The lesson worth stealing A naming convention that looks descriptive can be executable. -cloud reads like a label, "this one's the cloud version." It's a routing directive, consumed and stripped before the name ever reaches a registry, and when it goes wrong the error names a model that has never existed. The suffix is a verb. Treat it like one: Build on -cloud. Never publish as -cloud. This is the second time an Ollama default has quietly eaten my afternoon. The first was the day my model spent 400 tokens thinking and returned an empty string, which was also a case of a setting doing something other than what its name suggested. What other "conventions" in your stack are secretly load-bearing? I'd bet you've got one. Tell me in the comments, I collect these. FLASH is MIT licensed and takes PRs: github.com/Natuworkguy/Flash