Inspiration
One of our team members works in construction and has watched the same brutal process play out hundreds of times — an estimator opens a blank Word doc and spends 6 to 8 hours writing a single bid proposal from scratch. Every proposal is 20+ pages of technical scope, itemized pricing, site photo documentation, and project approach. Every project is different, so nothing is truly reusable. Contractors produce 5 to 10 of these a month. That's 40 to 80 hours of unbillable writing time — every single month.
We looked for an existing solution and found nothing. Construction is one of the least digitized industries in the economy, and proposal writing is still done the way it was 20 years ago: copy-pasting from old bids in Word, manually captioning site photos, and fighting formatting and page breaks. There is no AI-powered tool purpose-built for this. We saw a chance to eliminate an entire workflow that costs contractors thousands in lost revenue every month.
What it does
BidEngine turns a 6-hour manual process into a 15-minute guided workflow. Users enter project details, scope line items, and upload site photos. The AI pipeline does the rest — analyzing every photo with vision capabilities, retrieving relevant context from a knowledge base of real past proposals, and generating a complete professional bid: cover page, project approach, scope narrative, itemized pricing with realistic quantities and unit costs, photo documentation, and terms.
Every uploaded photo is scored for cover worthiness, captioned with professional descriptions, and auto-grouped into documentation pages with editorial layouts. If no photo scores high enough for the cover, the system pulls a Google Maps satellite view of the building as a fallback — so the first page always looks professional.
Users edit in a live side-by-side editor with real-time preview, toggle 20+ sections, choose from three PDF templates, and export a polished document via server-side rendering. Beyond generation, BidEngine includes a proposal library, photo markup tools, role-based team management, inline review with suggested edits, lead tracking, daily field reports, and Stripe-powered subscription billing.
What makes BidEngine fundamentally different: it gets smarter with every proposal. A built-in feedback loop captures which AI-generated sections users approve and which they flag, continuously improving retrieval quality — without any model retraining.
How we built it
Frontend: React 18 + TypeScript + Vite, styled with Tailwind CSS and 40+ shadcn/ui components on Radix primitives. Auth and subscription state live in React Context; server state is cached with React Query.
Backend: Supabase — PostgreSQL with Row-Level Security for multi-tenant data isolation, Supabase Auth for email/password and Google SSO, Supabase Storage for photo hosting. All API routes are Vercel serverless functions.
AI generation pipeline (Claude Sonnet 4): The generation endpoint takes the full intake form, retrieves relevant context from the knowledge base via RAG, and injects both RAG context and photo analysis into a single structured prompt that outputs the entire proposal as JSON.
Photo analysis (Claude Vision): Every uploaded photo is sent to Claude as a base64 image alongside project context. Claude runs a two-step scoring process — evaluating each photo on a 1-10 scale for cover worthiness, then categorizing photos into roles (cover, site logistics, documentation). Each photo gets a professional caption, and related photos are grouped into layout assignments (hero, side-by-side, before/after, 2x2 grid).
RAG knowledge base: The knowledge base is an Obsidian vault containing 11 real past proposals, 5 pricing histories, 4 scope templates, and 4 lessons-learned documents from actual construction projects — roof restorations, waterproofing, concrete repair, facade restoration, parking deck work. Each document is chunked and embedded into 384-dimensional vectors using the Xenova/all-MiniLM-L6-v2 sentence transformer via ONNX runtime. Vectors are stored in PostgreSQL using pgvector with IVFFLAT indexing for fast approximate nearest-neighbor search.
At generation time, the project's scope description and work items are embedded, then a match_knowledge_chunks database function retrieves the most similar past content. Results are ranked with a hybrid formula: 0.7 * cosine_similarity + 0.3 * quality_score. Human-approved content (quality 1.0) rises to the top; flagged content (quality 0.0) sinks — so retrieval quality improves organically over time.
The feedback loop has three ingestion paths:
Finalized proposals — every section is chunked, embedded, and stored at a quality level Thumbs up — the exact approved text is stored at quality 1.0 Thumbs down — stored at quality 0.0, deprioritized in future retrieval No retraining required. The system improves entirely through the retrieval layer.
Other integrations: Puppeteer/headless Chromium for pixel-perfect PDF export (with html2canvas + jsPDF client-side fallback), HMAC-signed export tokens, Google Maps Static API for satellite cover images, heic2any for iPhone HEIC-to-JPEG conversion, Stripe for checkout/portal/webhooks, and Resend for transactional emails.
Challenges we ran into
Getting AI output that construction professionals would actually trust was the hardest problem. Proposals require specific technical language, realistic unit pricing, and proper formatting — generic AI output is immediately obvious to anyone in the industry. Prompt engineering alone couldn't solve this. Building the RAG pipeline with real proposal content from the Obsidian vault is what finally closed the gap — giving Claude concrete examples of real pricing, real scope language, and real project approaches to draw from.
On the frontend, managing 20+ toggleable sections, three template layouts, inline pricing with automatic totals, multi-layout photo documentation pages, drag-and-drop reordering, real-time live preview, and 2-second autosave — all without the editor feeling sluggish — was a significant engineering challenge.
Accomplishments that we're proud of
We shipped a production-ready SaaS product in three days. Not a demo — a live application with authentication, subscription billing across three tiers, role-based team management, and a complete AI pipeline. BidEngine is deployed and accepting users today.
The self-improving knowledge base is what we're most proud of. It starts with a seeded vault of real construction documents. As users finalize proposals and rate individual sections, retrieval quality improves automatically. Approved content floats to the top of search results. Flagged content sinks. After enough usage, new proposals start pulling from highly relevant past content that makes output significantly more accurate and personalized to a company's voice and pricing — all without touching a model.
AI isn't a feature bolted onto a form builder here. Claude generates every text section. Claude Vision analyzes every photo. Vector embeddings power semantic retrieval. Human feedback closes the learning loop. The entire product is built around AI working well, not around AI being present.
What we learned
The gap between a working AI demo and a product someone would actually pay for is enormous. Getting Claude to generate text is easy — getting it to generate text that a construction estimator would trust enough to send to a client required building an entire retrieval and feedback infrastructure around it. Raw AI output alone wasn't good enough. The Obsidian vault, embedding pipeline, hybrid ranking, and feedback capture all exist because of that gap.
We also learned to design for the user, not the technology. Estimators don't care about AI — they care about winning contracts and not spending their evenings writing. Every decision was driven by that workflow, not by showcasing what's under the hood.
What's next for BidEngine
We plan to integrate industry pricing databases and material specifications so the AI generates accurate estimates out of the box — no seeded vault required for new teams. We're exploring connections to construction management platforms to pull project data directly into proposals. We also want to add real-time collaborative editing and a client-facing portal where clients can view, comment on, and digitally accept proposals without email attachments — closing the loop from bid creation to contract signing.
Built With
- anthropic
- chromium
- claude-api
- css
- dompurify
- eslint
- google-maps
- heic2any
- html2canvas
- jspdf
- obsidian
- postcss
- puppeteer
- react
- sql
- stripe
- supabase
- swc
- typescript
- vercel
- vite
- xenova
- xlsx
- zod

Log in or sign up for Devpost to join the conversation.