SiteSync helps commercial construction teams review schedule blockers, procurement, submittals, inspections, and RFI drafts. This repository contains the complete Next.js frontend and FastAPI backend.
Deploy the repository root as a Render Blueprint using render.yaml. The configuration runs both servers in one Docker service and stores fictional demo data temporarily. The service uses Render’s Free plan with no persistent disk. Data resets on sleep, restart, or deployment.
Read the hosting guide for setup and credentials. The landing page is at /; the app is at /login. Render creates the HTTPS address during deployment.
The hosted demo uses fresh fictional Schimenti projects for Alo Yoga and Sage and Sound. Provider connections and email sending are simulated. Project data requires sign-in; the owner password is generated in Render. The published local development password does not work in hosted mode.
Live: https://sitesync-demo.vercel.app (sign in at /login). Two Vercel projects, deployed with the CLI from each folder (vercel deploy --prod):
sitesync-api (root backend/): FastAPI served by index.py, with Neon Postgres from the Vercel Marketplace. Tables and demo data are created on the first request, guarded by a Postgres advisory lock so concurrent cold starts cannot seed twice.sitesync-demo (root frontend/): Next.js. API_INTERNAL_URL points at the API project; /api/* is proxied so the session cookie stays same-origin.Visitors create their own account at /signup (OPEN_SIGNUP=true). Sign-up asks for a company name and creates that company’s organization, seeded with the fictional sample projects, so different companies cannot see or change each other’s data. Everyone in a company shares its projects and tasks: an owner or admin finds the company invite code in Settings, and a teammate enters it at sign-up (or via /signup?invite=CODE), or in Settings if they already have an account and are alone in their own workspace. New members are granted every company project, and an admin can still revoke one in project settings. Existing databases gain the organizations.invite_code column automatically on the next request (and via Alembic revision 005). Sign-ups are rate limited and capped (SIGNUPS_PER_HOUR, MAX_ORGANIZATIONS). Email verification, password reset and account deletion are built in. Email delivery needs a provider: set RESEND_API_KEY + MAIL_FROM (a sender on a domain verified in Resend), or SMTP_HOST/SMTP_PORT/SMTP_USER/SMTP_PASSWORD + MAIL_FROM. Without one, new accounts are marked verified and the forgot-password link is hidden. Keep the site to fictional or test data. Deploy both projects with bash deploy/deploy-vercel.sh (after npx vercel@latest login).
Production env vars on sitesync-api: APP_ENV=hosted-demo, DEMO_MODE=true, PRIVATE_DEMO=true, ENABLE_EMAIL_SEND=false, APP_URL, API_URL, plus PRIVATE_DEMO_PASSWORD (20-72 bytes), JWT_SECRET and TOKEN_ENCRYPTION_KEY. Neon supplies DATABASE_URL/POSTGRES_URL. Vercel request bodies are capped near 4.5 MB, so large uploads are limited. There is no background scheduler on Vercel; use Vercel Cron if scheduled sync is needed.
https://canaanstu.github.io/sitesync-demo/ is a static build with no backend. It uses recorded fictional data (frontend/lib/demo-data.json) and an in-browser mock API (frontend/lib/mock-api.ts). Quests, schedule progress and deliveries work and reset on reload; uploads, new projects and AI answers are disabled. .github/workflows/pages.yml deploys it on pushes to main (Settings → Pages → Source must be “GitHub Actions”). To refresh the data, run a freshly seeded local backend and python deploy/record-demo-fixtures.py. Build locally with SITESYNC_STATIC=true NEXT_PUBLIC_STATIC_DEMO=true NEXT_PUBLIC_BASE_PATH=/sitesync-demo npx next build in frontend.
From the cloned repository root, start the backend:
cd backend
python -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
.venv\Scripts\python -m uvicorn app.main:app --reload --port 8000
In another terminal:
cd frontend
npm install
npm run dev
Open http://localhost:3000/login. Local-only demo credentials: demo@example.com / DemoProject2026!. On macOS/Linux use .venv/bin/python.
Backend: run python -m pytest -q from backend using the virtual environment. Frontend: run npm run typecheck and npm run build from frontend.
See validation notes and landing-page behavior. Local tests do not verify live Procore/Microsoft authorization or cloud deployment.
Keep .env, .local, credentials, databases, and contact exports out of Git. AI drafts require human review. Procurement lead times and carrier updates depend on recorded source information. Received materials do not prove installation complete. Use approved integrations and separate production infrastructure before handling real contractor records.