About the project Disclosure: what existed before and what we built during LUMA We want to be upfront. Braxel is a CRM that already existed before the hackathon. It started on August 31, 2026, and its AI research agent (Eve) and the Lead OS dossier ran before the event.
During the LUMA window (September 20 to 28) we built the parts this submission is about. Every commit is dated in the public repository:
Sept 21: the Finance page and the per-lead financial projection, the Impact page, the mandatory human review with a written reason, and the synthetic demo data. Sept 22: a security fix that refuses javascript: links from web research, a trust boundary for the AI agent, an end-to-end test, and a fix that made the test suite green again. Sept 24: a fix that locks every contact channel until a person approves the lead, a fix that removes rejected leads from the financial totals, and demo polish. Some early drafts were written on September 18 and 19 and merged into the repository from September 21. The judges can check every date on GitHub.
Inspiration Small agencies in Colombia find clients by messaging local businesses cold. That burns their reputation, and it is expensive: a message sent to the wrong business costs time and trust. The other option is to research every business by hand, which does not scale. We wanted a tool that researches first, lets a person decide, and answers one question with numbers instead of intuition: is this way of selling financially sustainable?
What it does An AI researches the lead. For each local business it builds a dossier: public evidence with sources, three scores (evidence quality, commercial opportunity, contact priority), a recommended offer and a price range. A person decides. Approving or rejecting a lead requires a written reason of at least 10 characters. The decision, the reviewer and the reason go into the company history. Until a person approves, every contact channel is locked: WhatsApp, Instagram, Facebook, email and phone. Finance turns scores into money. For each lead it shows: Close probability: P = 0.6 × (opportunity ÷ 100) + 0.4 × (priority ÷ 100) Expected value: EV = P × V − C, where V is the deal value and C is the cost of one contact Break-even probability for one contact: P* = C ÷ V The portfolio view shows sustainability. It shows the total expected value, how much of the monthly platform cost that covers, and how many leads per month are needed to break even: ceil(platform cost ÷ average EV). It also shows conservative, base and optimistic scenarios. Everything is adjustable and verifiable. Deal value, cost per contact, platform cost and the COP/USD rate are editable, and every number recalculates live. The page prints each formula with the real numbers substituted, so a judge can recompute any row by hand. Example with the default assumptions (opportunity 74, priority 88, V = COP 3,000,000, C = COP 25,000): P = 0.6 × 0.74 + 0.4 × 0.88 = 0.796, EV = 0.796 × 3,000,000 − 25,000 = COP 2,363,000, which is USD 590.75 at 4,000 COP per USD.
How we built it
Monorepo with Bun and Turborepo: a Next.js 16 web app, a NestJS API with tRPC, and a separate AI agent service. PostgreSQL with Prisma for data. The API writes a durable task row and the agent picks it up, so research never blocks the app. The financial model is pure TypeScript functions in packages/validation/src/lead-finance.ts, covered by 18 unit tests. The API only returns the stored scores and does no math, so the lead page and the portfolio page use exactly the same formulas. Zod validates every input at the boundary: the intake payload, the dossier and the financial assumptions. The full test suite has 1,128 tests, runs on every push and passes. Business model and financial sustainability Braxel serves a small digital agency that sells websites and automation to local businesses (for example, a conversion website with a WhatsApp catalog, discussed in a COP 2.5M to 4M range). The agency's costs are the platform and the time spent contacting leads. Finance answers the questions that decide whether that business survives:
Is this lead worth contacting? Compare P with P*.
What is the pipeline worth? Look at the total expected value. How many qualified leads do we need each month? Look at the break-even. The human review is also a financial control. Every rejected lead is a contact the agency does not pay for, and rejected leads count as zero in the totals.
Challenges we ran into
Making the math honest. The close probability is a heuristic based on the dossier scores. It is not a model trained on real closed deals, because the CRM does not store closing outcomes yet. We say this on screen, next to the formula. Not counting the wrong things. Our first version added rejected leads to the expected value. A rejected lead is never contacted, so its value is zero. We fixed it. Keeping "no contact without approval" true everywhere. One contact panel was locked, but other buttons in the app still opened WhatsApp and email. We found this by running the demo end to end, and now one shared rule locks every channel. Security. Evidence links come from web pages anyone can edit. javascript: and data: links are now refused on input and never rendered. Accomplishments that we're proud of A financial model a judge can verify by hand, with a step-by-step calculation on screen. COP and USD support with an editable exchange rate. A clear split between measured numbers (from the database) and assumed numbers (from editable settings). An end-to-end test that walks the whole path: lead intake, AI dossier, locked channel, a decision refused without a reason, approval, unlocked channel and history note. What we learned A number is only useful if people trust it. A simple formula with visible assumptions persuades more than a black box. We also learned to label estimates as estimates.
What's next for Braxel CRM
Record real outcomes (replied, meeting, won, lost) so the close probability can be calibrated with real data instead of a heuristic. Measure the real cost per contact from activity instead of asking for it. A staging deployment separate from production.
Limitations (please read)
The five companies in the demo are synthetic. Their links use the reserved .invalid domain and cannot reach anyone. The close probability is a heuristic, not a trained model. The default money values (deal value, cost per contact, platform cost) are starting assumptions you can edit on screen. Live AI research needs a model API key, so the demo uses dossiers that were already generated.
Built With
- bun
- nestjs
- next.js
- postgresql
- prisma
- react
- shadcn-ui
- tailwindcss
- trpc
- turborepo
- typescript
- vercel
- zod