Skip to content

Tenant demo: McDuff Gillis + internal compliance lights - #7

Merged
fsu9913-gif merged 1 commit into
cursor/make-rent-ruby-live-1bd0from
cursor/tenant-demo-compliance-d477
Aug 15, 2026
Merged

Tenant demo: McDuff Gillis + internal compliance lights#7
fsu9913-gif merged 1 commit into
cursor/make-rent-ruby-live-1bd0from
cursor/tenant-demo-compliance-d477

Conversation

@CARBComplianceApp

Copy link
Copy Markdown

This is the tenant.rent-ruby.com owner walkthrough, not the live marketing site.

The current working branch was the live-site track (cursor/make-rent-ruby-live-1bd0). These edits live on a separate demo branch so the lounge can be shown to the owner before that subdomain is public.

What the owner will see

  • Tenant Lounge opens as McDuff Gillis, Unit 105 (replaces the old Jordan Smith / generic Unit 105 demo identity).
  • Visiting tenant.rent-ruby.com (or any tenant.* host) lands on the tenant view automatically.
  • A staff-only traffic light, not shown as a resident status:
    • Green — paperwork up to date
    • Orange — waiting on a signed lease or notice (McDuff’s 2026 packet)
    • Red — rent 60+ days past due and/or possible unauthorized subletter (Unit 203 in the demo roll)

Cloudflare

  • Added a Workers static-assets config (wrangler.jsonc) that serves the showcase SPA from the existing rent-ruby Worker.
  • Deploy preview: npm run deploy:tenant-demo
  • Attach tenant.rent-ruby.com in the Cloudflare dashboard when DNS is ready. This does not go live by merging.

How to review

  1. npm run dev → switch to Tenant. Header should say McDuff Gillis, Unit 105, with the internal orange light and legend.
  2. Switch to Admin → Rent Roll (or Hub owner snapshot) and confirm green / orange / red lights.
  3. npm run build:showcase already passes locally. npx tsc --noEmit passes.
Open in Web Open in Cursor 

Name the Unit 105 tenant McDuff Gillis, open the lounge on tenant.rent-ruby.com, and add internal green/orange/red file lights for paperwork, pending signatures, and 60-day / sublet risk.

Co-authored-by: CARBComplianceApp <CARBComplianceApp@users.noreply.github.com>
@fsu9913-gif
fsu9913-gif marked this pull request as ready for review August 15, 2026 18:19
Copilot AI lite review requested due to automatic review settings August 15, 2026 18:19
@fsu9913-gif
fsu9913-gif merged commit 39a4ea5 into cursor/make-rent-ruby-live-1bd0 Aug 15, 2026
1 check passed

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Risk: medium. Approved; Bugbot and Security Agent were not present after the first check poll, and no approval policy requires human review. No reviewers assigned.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver (1)

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR sets up a dedicated tenant-demo experience (tenant.rent-ruby.com) with a new demo identity (McDuff Gillis, Unit 105) and introduces “internal compliance lights” (green/orange/red) for staff-facing rent roll and owner snapshot views.

Changes:

  • Added Cloudflare Workers deployment for the static tenant showcase build (Wrangler config + minimal Worker).
  • Implemented compliance status derivation + UI components (legend + traffic-light chip) and wired them into rent roll + owner snapshot.
  • Updated demo data/identity across the tenant lounge/portal, seed data, and docs.

Reviewed changes

Copilot reviewed 13 out of 15 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
wrangler.jsonc Adds Wrangler config to serve SPA assets from a Worker.
workers/tenant-demo.ts Minimal Worker that proxies to ASSETS.fetch() for static hosting.
src/lib/tenantCompliance.ts Introduces compliance status types + derivation helpers.
src/components/ComplianceLight.tsx Adds reusable compliance light UI + legend.
src/components/RentRollDashboard.tsx Displays staff compliance lights for each unit + legend in the rent roll UI.
src/components/OwnerShowcaseSnapshot.tsx Adds staff compliance lights column and legend for the owner showcase snapshot.
src/lib/demoTenant.ts Centralizes demo tenant identity + tenant-demo host detection.
src/components/TenantPortal.tsx Updates demo tenant usage in the tenant portal (unit/name/rent/payment date).
src/App.tsx Auto-routes tenant.* hosts to tenant view and adds demo-only staff compliance strip.
server.ts Seeds/patches demo tenant data and extends rent-roll API shape with compliance-related counts.
README.md Documents Cloudflare tenant demo workflow and expectations.
public/owner-demo.html Updates owner-demo copy to reflect McDuff identity.
package.json / package-lock.json Adds Wrangler and a deploy script for the tenant demo.
.gitignore Ignores Wrangler local state and dev vars.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/lib/demoTenant.ts
Comment on lines +12 to +19
const TENANT_DEMO_HOSTS = new Set([
'tenant.rent-ruby.com',
'tenant.localhost',
'tenant.127.0.0.1.nip.io',
]);

export const isTenantDemoHost = (hostname = window.location.hostname) =>
hostname.startsWith('tenant.') || TENANT_DEMO_HOSTS.has(hostname);
Comment thread src/App.tsx
Comment on lines +521 to +524
<h1 className="text-4xl font-black text-app-text uppercase tracking-tighter">Tenant <span className="text-app-accent italic">Lounge</span>.</h1>
<p className="text-app-text/40 text-[10px] font-bold uppercase tracking-[0.2em]">
Welcome back, {DEMO_TENANT.firstName}. Unit {DEMO_TENANT.unit} · 3875 Ruby Street.
</p>
Comment on lines 198 to 202
const [rentStatus, setRentStatus] = useState<{ amount: number, last_payment: string, status: string } | null>(null);
const [mailboxCustomizations, setMailboxCustomizations] = useState<Record<string, { color: string }>>({});
const [selectedMailbox, setSelectedMailbox] = useState<string | null>(demoMode ? '105' : null);
const [currentUserUnit, setCurrentUserUnit] = useState<string>('105'); // Mocked for demo
const [selectedMailbox, setSelectedMailbox] = useState<string | null>(demoMode ? DEMO_TENANT.unit : null);
const [currentUserUnit, setCurrentUserUnit] = useState<string>(DEMO_TENANT.unit);

Comment thread server.ts
Comment on lines +588 to +601
try {
db.prepare(`
UPDATE tenants
SET name = 'McDuff Gillis',
email = 'mcduff.gillis@rent-ruby.com'
WHERE unit_id IN (SELECT id FROM units WHERE unit_number = '105')
AND (name LIKE 'Tenant 105%' OR name LIKE 'Jordan%' OR name != 'McDuff Gillis')
`).run();
db.prepare(`
UPDATE bank_transactions
SET description = 'CHASE DIRECT DEP - MCDUFF GILLIS'
WHERE description LIKE '%JORDAN SMITH%'
`).run();
} catch (e) {}
Comment thread server.ts
Comment on lines +696 to +700
COALESCE((
SELECT COUNT(*) FROM lease_updates lu
WHERE lu.tenant_id = t.id AND lu.status IN ('Pending', 'In Progress', 'Ready for Review')
), 0) as pending_lease_docs,
COALESCE((
Comment thread package.json
Comment on lines 40 to 44
"tailwindcss": "^4.1.14",
"typescript": "~5.8.2",
"vite": "^6.2.0"
"vite": "^6.2.0",
"wrangler": "^4.34.0"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants