AI-powered tender response platform for Australian businesses bidding on government tenders.
- Frontend: React + Vite (artifacts/tenderai), Wouter, TanStack Query, shadcn/ui, Tailwind v4
- API: Express 5 (artifacts/api-server) on /api
- Auth: Clerk (Replit-managed)
- DB: Postgres + Drizzle (lib/db) — profile, tenders, documents, requirements, compliance, risks, drafts, activity tables
- AI: Replit AI integrations OpenAI proxy (gpt-5.4) —
aiJson/aiTexthelpers - Storage: Object storage for tender docs (PDF/DOCX, parsed via pdf-parse/mammoth)
- Export: docx + pdfkit for response export
- Business profile builder (company details, capabilities, staff, past performance, certs, compliance statements) with completeness score
- Tender CRUD + 3 auto-seeded sample tenders on first dashboard load
- Document upload, sync parse, requirements extraction (AI)
- Compliance gap analysis (AI)
- Contract risk analysis (AI)
- 9-section AI-drafted response with editor + DOCX/PDF export
- Dashboard with stats, deadlines, activity
- Sample tenders seed lazily per user via
seedSampleTendersForUseron GET /api/dashboard/summary - Single-user v1 — no AusTender, no Stripe
- Clerk uses publishableKeyFromHost(hostname, fallback) so dev test key works
- Targets WCAG 2.1 AA. See
artifacts/tenderai/docs/accessibility.md. - Skip link, semantic landmarks, focus-on-route,
aria-currentnav are inAppShell.tsx(andlanding.tsx). - Global tokens:
--muted-foregroundraised to215 25% 35%for AA contrast; global:focus-visiblering;prefers-reduced-motionhonoured (seesrc/index.css). - Form pattern: every
<Label>ishtmlFor-bound; required fields usearia-required+aria-invalid. ProfileFieldinjects anidviacloneElement. - Icon-only buttons carry
aria-label; decorativelucide-reacticons getaria-hidden="true". - Toaster passes
type="foreground"for destructive variants (assertive announcements) and"background"otherwise. - Viewport allows zoom (no
maximum-scale).