4 min read

the answer that wasn’t from the ai

my server never threw an error. it just quietly handed me fake study material.

  • interact
  • build-in-public
  • product
One glowing document card standing out in a row of grey cards
interactbuild-in-publicproduct

Interact was in a good place. Sign up worked, the onboarding questions worked, and the study view had the sidebar, sections and progress checkmarks all in place. I typed in a topic, picked my answers, and got a full set of sections back. It felt done enough to test on a real topic.

I tried it on transistors. Section 1.1 came back as “Introduction to Transistors,” and the first line said “this section provides a exhaustive with derivations, proofs, edge cases of the key ideas.”

Material that read wrong

That sentence isn’t English. Then I opened section 1.2 and it had the same headers: Core Concepts, Detailed Explanation, Practical Implications, Summary. Same bullets too, just with a different title on top.

No AI writes like that. Something was filling in a template.

No error anywhere

I checked the terminal and the network tab. Nothing was red. The request came back 200 every time.

That’s when I understood. My server had a fallback. If the AI call failed for any reason, it caught the error and returned pre-written template material instead. The frontend never found out. It got a normal response with fake content in it.

The only reason I caught it was the broken grammar in the template text. A fallback that never complains is a bug hider.

The model was gone

Once I looked at the server logs, the real error was there. It was a 404 saying the Gemini model I’d hardcoded wasn’t available to new users anymore. It had been failing on every request since I started testing.

I swapped the model name, and real material finally came back.

Then it was real, and it wasn’t good

It was real now but too short and too generic. I’d chosen a deep level and a specific reason for studying, and the output barely reflected either. I tried a stronger model next, but the free tier gave that model a quota of zero, so that was a dead end.

[fill in what you did next: prompt changes, splitting outline and sections into two calls, or which provider you ended up on]

What I changed

The fallback now logs the actual error loudly, and a failed generation shows the user an error instead of fake content. I’d rather see something break than have it look fine.

I’ve kept testing on real topics since then, because the template text only gave itself away by accident. Next up is spaced repetition, so people actually remember what they study.

thoughts
and notes

here i share ideas, document experiments, and talk about things i'm learning or building along the way. it's more of a quiet corner for insights, progress, and everything in between.