Proposal Management System - AI-powered proposal generation and management
Find a file
Adam Moussa a9c157dc95 Fix iOS 26 launch crash: patch netinfo removed CoreTelephony APIs
netinfo v12.0.1 calls subscriberCellularProvider and
currentRadioAccessTechnology which were removed in iOS 26. No newer
version exists. Add patch-package with respondsToSelector guards so
the app gracefully returns nil for carrier info and skips cellular
generation detection on iOS 26+ instead of crashing on launch.
2026-05-20 11:52:43 -04:00
.github Add email/password login, fix Cognito config, enable mobile auto-deploy 2026-05-20 11:36:51 -04:00
api Bump Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore from 8.0.11 to 8.0.27 (#37) 2026-05-18 19:37:30 +00:00
infra Add email/password login, fix Cognito config, enable mobile auto-deploy 2026-05-20 11:36:51 -04:00
lambdas Fix compliance violations: Lambda defaults, CI node-version, dead code 2026-05-18 18:28:31 -04:00
mobile Fix iOS 26 launch crash: patch netinfo removed CoreTelephony APIs 2026-05-20 11:52:43 -04:00
scripts Add iOS CD pipeline and refactor workflows to org reusable callers (#24) 2026-05-18 15:30:30 -04:00
shared/api-contracts Initial scaffold: monorepo structure, CDK stacks, CI/CD, domain model 2026-05-16 18:40:46 -04:00
web Bump @tanstack/react-query from 5.100.10 to 5.100.11 in /web (#42) 2026-05-18 22:12:14 +00:00
.gitignore Fix RN bundle phase: align metro-config and babel-preset with RN 0.85 2026-05-19 19:21:33 -04:00
docker-compose.yml Implement Phases 2-5: Frontend, AI/RAG, PDF Generation (#22) 2026-05-17 13:06:23 -04:00
README.md Add email/password login, fix Cognito config, enable mobile auto-deploy 2026-05-20 11:36:51 -04:00

Proposal System

Internal proposal management platform for Sea Haven Industries. Dispatchers submit proposal requests, AI generates draft line items from historical data via Bedrock RAG, admins review and approve in a pricing workspace, and the system produces branded PDFs for delivery.

Architecture Overview

Monorepo with five primary services:

  • .NET 8 API -- Clean Architecture REST API hosted on Lambda behind API Gateway
  • React 19 Web -- MUI v7 admin/dispatcher workspace served via CloudFront + S3
  • React Native Mobile -- iOS-first field app for dispatchers (offline-capable)
  • Python Lambdas -- PDF extraction, PDF generation, library ingestion, AI suggestions, AOSS index provisioning
  • CDK Infrastructure -- Three TypeScript stacks managing all AWS resources

Repository Structure

proposal-system/
├── api/            .NET 8 Web API (Lambda-hosted, EF Core + PostgreSQL)
├── web/            React 19 + MUI v7 + Vite frontend
├── mobile/         React Native 0.85 iOS app
├── lambdas/        Python 3.12 processing functions (arm64)
├── infra/          CDK TypeScript (3 stacks)
├── shared/         TypeScript API contracts (shared between web + mobile)
├── scripts/        Post-deploy and utility scripts
├── .github/        CI/CD workflows
└── docker-compose.yml

Tech Stack

Component Technologies
API .NET 8, ASP.NET Core, EF Core + Npgsql, FluentValidation, Cognito JWT, Amazon.Lambda.AspNetCoreServer
Web React 19, TypeScript, MUI v7, Vite, Redux Toolkit, TanStack Query, axios
Mobile React Native CLI 0.85, React 19, React Native Paper, React Navigation, react-native-app-auth (PKCE), amazon-cognito-identity-js (SRP), Keychain, offline draft queue
Lambdas Python 3.12, arm64, pdfplumber, reportlab, httpx, boto3
Infrastructure CDK TypeScript (aws-cdk-lib 2.253.1)
AI/RAG Bedrock Knowledge Base (Titan Embeddings v2), OpenSearch Serverless, Claude via Bedrock Runtime
Auth Cognito User Pool + Google OAuth IdP (groups: dispatchers, admins, sysadmins)

AWS Resources

All resources are in us-east-1 (account 328440206208).

CDK Stack Key Resources
proposal-system-foundation RDS PostgreSQL 15 (t4g.small), S3 buckets, SQS queue + DLQ, Cognito user pool, Secrets Manager
proposal-system-compute API Gateway HTTP API, .NET 8 API Lambda, Python Lambdas (pdf-extract, pdf-generate, library-ingest, suggestions, oss-index-creator), OpenSearch Serverless collection, Bedrock KB
proposal-system-frontend CloudFront distribution (S3 OAC)
Resource Type Names
S3 Buckets proposal-system-uploads, proposal-system-generated, proposal-system-library, seahaven-ios-certificates
SQS proposal-system-jobs + proposal-system-jobs-dlq (message body filtering by jobType)
Secrets proposal-system/db-credentials, proposal-system/internal-api-key

Local Development

Prerequisites

  • .NET 8 SDK
  • Node.js 24+
  • Python 3.12
  • PostgreSQL 16 (via docker-compose or native)

Database

docker compose up -d    # starts PostgreSQL on port 5432
# database: proposalsystem, password: localdev

API

cd api
dotnet restore
dotnet run --project src/ProposalSystem.Api
# runs on http://localhost:5000

In development mode (DevMode=true in appsettings.Development.json):

  • JWT auth uses a local symmetric HMAC key (no Cognito required)
  • S3 service returns fake presigned URLs
  • SQS publisher logs messages without sending

Web Frontend

cd web
npm install
npm run dev
# runs on http://localhost:5173, proxies /api to localhost:5000

When VITE_COGNITO_CLIENT_ID is not set, the login screen shows role-selector buttons for local development.

Infrastructure

cd infra
npm install
npx cdk synth

CI/CD

CI (on pull request to main)

Five parallel jobs calling org reusable workflows:

Job Workflow What it checks
.NET Build & Test ci-dotnet.yaml Restore, build, test the API solution
Web Frontend Check ci-typescript-cdk.yaml TypeScript typecheck for web
Mobile Typecheck ci-typescript-cdk.yaml TypeScript typecheck for mobile
Python Lint ci-python-sam.yaml ruff check + format on lambdas/
CDK Synth ci-typescript-cdk.yaml Synthesize CDK stacks (includes .NET publish)

Deploy (on push to main)

Calls cd-cdk.yaml reusable workflow:

  1. Publishes .NET 8 API and Python Lambdas
  2. Runs cdk deploy --all
  3. Executes scripts/post-deploy.sh (builds web, syncs to S3, invalidates CloudFront)

Deploy uses OIDC role githubdeploy-proposal-system. Concurrency group prevents parallel deploys.

Mobile Deploy

Workflow: deploy-mobile.yaml -- builds and uploads to TestFlight via cd-mobile-ios.yaml reusable workflow on macos-26.

Triggers:

  • Automatic: push to main with changes in mobile/**
  • Manual: workflow_dispatch for on-demand builds

Mobile iOS

The iOS app uses Fastlane with match for code signing. Certificates and profiles are stored in the seahaven-ios-certificates S3 bucket (versioning enabled, public access blocked).

Build and upload to TestFlight is handled by the cd-mobile-ios.yaml reusable workflow. Required secrets:

Secret Purpose
AWS_DEPLOY_ROLE_ARN OIDC role for match S3 access
MATCH_PASSWORD Decryption passphrase for signing assets
ASC_KEY_ID App Store Connect API key ID
ASC_ISSUER_ID App Store Connect issuer
ASC_KEY_CONTENT App Store Connect API key (base64)

Data Flow

  1. Dispatcher submits proposal request (web or mobile)
  2. API creates proposal record, publishes SQS message
  3. If vendor PDF attached: pdf-extract Lambda parses and structures data
  4. Suggestions Lambda queries Bedrock KB for similar proposals, generates line items via Claude
  5. Admin reviews/edits line items in pricing workspace
  6. On approval: pdf-generate Lambda creates branded PDF
  7. On send: library-ingest Lambda adds approved proposal to KB for future matching