Inspiration
Startups rarely fail because of bad code. They fail because founders sit in echo chambers. Friends, family and early teammates are usually too polite to name the fatal flaw in a business model, and the first person who does is often a customer who walks away or an investor who passes.
We wanted that honest conversation to happen early, when fixing the flaw is still cheap. Crucible is the investor you meet on their worst day: unbiased, unsparing and specific, so you can strengthen an idea before the market tests it for you.
What it does
Paste in a startup pitch, a target market or a product concept, and Crucible returns a structured critique:
- Verdict: a blunt read on whether the idea holds up
- Market risk: who already does this better, and why customer acquisition might fail
- Business model: whether pricing and margins are realistic
- Execution risk: whether the team, infrastructure and timeline can deliver
- Competition: the alternatives your customers have today
Every first analysis ends with three targeted questions the founder must be able to defend. You can argue back, and Crucible keeps the conversation in context and says which points now hold up and which are still weak. A harshness control (Firm, Ruthless, Brutal) sets how hard the critique hits, and past pitches are saved in a sidebar so you can reopen them.
How we built it
- Interface: Streamlit, restyled with custom CSS into a dark gradient theme with card-style chat messages, using Bricolage Grotesque and Instrument Sans. We wanted it to feel like a venture-backed product, not a default data dashboard.
- Inference: Nebius Token Factory serving the NVIDIA Nemotron model family. Because the platform is OpenAI-compatible, we connected through the standard
openaiPython client and streamed tokens so replies appear as they are written. - Prompt design: a system prompt defines the investor persona and the fixed critique structure. The harshness setting changes the tone of that prompt at runtime, and a separate rule set governs follow-up turns.
- State: every conversation is saved to a local JSON file, which powers the sidebar history.
- Resilience: the app asks the provider which models are currently available and builds its model selector from that list, instead of hard-coding model names.
Challenges we ran into
Fighting Streamlit's defaults. Streamlit's components have fixed styling, so a consistent dark interface took layers of CSS overrides. Inputs and dropdowns kept falling back to a light theme until we styled each nested layer of their markup.
Harsh but useful. Early prompts produced either vague politeness or plain insults. Getting the model to be ruthless and give structural, actionable feedback took repeated prompt rewrites and temperature tuning.
Holding one voice over a long chat. As the founder argues and pivots, the model has to stay in persona and keep its critique format. Follow-up turns needed their own explicit instructions.
A retired model mid-build. A model we depended on was decommissioned and the app began returning errors. That pushed us to load the live model list rather than rely on a fixed name.
What we learned
- A system prompt is a design problem. The persona, the output structure and the rules for follow-up turns each have to be specified.
- "Harsh" and "helpful" are separate dials, and turning up the first without losing the second is the real work.
- Streamlit can be pushed much further than its defaults, with CSS doing most of the work.
- Never hard-code anything a third-party provider can change.
What's next for Crucible
- Pitch deck upload: parse PDF decks so founders get feedback on the real thing
- Voice: text-to-speech so Crucible can deliver its critique out loud, plus speech input to practise pitching live
- Per-user accounts: private chat histories, so a public deployment is safe for confidential ideas
- Scorecards: ratings across market, team, traction and defensibility, to track improvement between pitches
- Exportable reports: download a critique as a PDF to share with co-founders or mentors
Log in or sign up for Devpost to join the conversation.