USA PROJECT NETWORKPOWERED BY NORTHSTAR AI
Join free
Loading projects…
Select a project to review its scope, trades, deadline, and estimating options.
+(x.award_amount_cents/100).toLocaleString():null].filter(Boolean).join(' · '))+'

'+esc(x.verification_status+' · '+(x.source_name||'Public source'))+'
').join(''):'
'+esc(p.awarded_gc_name?('Awarded GC: '+p.awarded_gc_name):'No verified GC award has been published yet.')+'
')}catch(e){body.innerHTML='
Lifecycle data is temporarily unavailable.
'}return}if(name==='bidders'){body.innerHTML='

Publicly identified bidding GCs

'+((p.public_bidding_gcs||[]).length?(p.public_bidding_gcs||[]).map(t=>''+esc(t)+'').join(''):'No bidding GCs are publicly identified yet.')+'

Installer and subcontractor bid amounts remain private to authorized participants.

';return}body.innerHTML='
Build your estimate with Northstar

Select your trade or an approved manufacturer package. Northstar prepares measured quantities and a bid-ready estimate for your review.

Build My EstimateSave / Intent to Bid
'} for(const id of ['search','trade','county','type','sort','seven','thirty','openOnly'])document.querySelector('#'+id).addEventListener(id==='sort'||['seven','thirty','openOnly','type'].includes(id)?'change':'input',()=>{if(id==='trade'||id==='county'){if(statesEl.value)return}render()}); statesEl.addEventListener('change',()=>loadProjects().catch(fail));document.querySelector('#trade').addEventListener('change',()=>statesEl.value&&loadProjects().catch(fail));document.querySelector('#county').addEventListener('change',()=>statesEl.value&&loadProjects().catch(fail)); document.querySelector('#saveSearch').onclick=()=>{localStorage.setItem('usa-project-search',JSON.stringify({state:statesEl.value,trade:document.querySelector('#trade').value,county:document.querySelector('#county').value,type:document.querySelector('#type').value}));alert('Search saved on this device.')}; function fail(){count.textContent='Unavailable';results.innerHTML='
The opportunity feed is temporarily unavailable.
'} Promise.all([loadStates(),loadProjects()]).catch(fail);