House Desk is an independent Cloudflare Pages product for the private, auto-updating I-House Programs calendar, the public Bulletin, resident subscription management, and staff operations. It owns its own data, review workflows, delivery, roles, and permissions.

Start here

GoalDocumentation
Subscribe to or manage ProgramsResident guide
Understand request and publication flowArchitecture
Choose the correct hostnameOrigin boundary
Review and publish ProgramsEvent review and publication
Operate the staff consoleOperations reference
Manage staff access and rolesIdentity and access
Deploy, verify, or recover the serviceOperations guide

Human, admin, and email-action origin: desk.ihnyc.affectivetech.com

Private feed and compatibility origin: calendar.ihnyc-rc.org

Repository: dghauri0/ihnyc-rc-cal-landing

Product surfaces

SurfacePurposeAccess
/Resident entry to Programs, Manage, Bulletin, and staff sign-inPublic
/subscribe-programsRequest a verified Programs subscriptionPublic with anti-abuse controls
/manageRequest a short-lived link to inspect, renew, or revoke a private feedPasswordless email action
/contributeRequest and configure a private Programs forwarding addressPublic guidance; operator enrollment
/updatesSearch reviewed Bulletin knowledge and read published noticesPublic
/admin/Capability-projected Operations consoleCloudflare Access plus a local grant
/cal/programs.icsFetch the Programs calendarPrivate calendar token

Publication and knowledge flow

flowchart LR
  SOURCES["Happenings, WhatsApp, PDFs, and operators"] --> REVIEW["House Desk review queues"]
  REVIEW -->|"publish Programs"| EVENTS[("D1 program events")]
  REVIEW -->|"publish Bulletin"| KNOWLEDGE[("D1 reviewed knowledge")]
  EVENTS --> SCHEDULER["Programs scheduler"]
  SCHEDULER --> FEED["Private ICS feed"]
  KNOWLEDGE --> BULLETIN["Public Bulletin search and notices"]

Nothing publishes directly from an intake. Operators review content, resolve duplicates or source discrepancies, and make an explicit publication transition. The Bulletin is the current public name for tables and routes that may still retain house_updates in source for compatibility.

Runtime and storage

  • Eleventy builds resident and Operations pages from src/ into dist/.
  • Cloudflare Pages Functions handle subscription, management, feed, intake, webhook, and admin requests.
  • D1 (SUBS_DB) stores subscribers and token hashes, Programs and Bulletin content, resident projections, operator grants and roles, templates, source receipts, and audit records.
  • R2 stores the generated programs.ics, immutable event flyers, private resident archive material, and commissioned WhatsApp media in separately bounded bindings.
  • A standalone Worker rebuilds the Programs feed from published D1 rows every 15 minutes.
  • Resend delivers product email; Turnstile protects high-abuse public actions.

Staff access has independent gates

Every admin request passes three checks:

  1. Cloudflare Access admits the identity and signs a product-specific assertion.
  2. House Desk verifies that JWT in application code and resolves the normalized email through immutable recovery configuration or an exact D1 grant.
  3. The method and path must map to one of the 41 canonical permissions in functions/_lib/route-actions.ts.

Routine access is managed in /admin/access/. Administrators can create or edit reusable roles, assign an exact snapshot to a person, fine-tune a person into a Custom grant, and review append-only access history. Recovery administrators remain outside D1 and cannot be changed through the UI. Unknown routes, malformed grants, unavailable authorization storage, and unassigned identities fail closed.

Authentik will become the shared upstream staff identity provider through Cloudflare Access. House Desk’s local grants, role templates, application audience, and route checks remain authoritative. See Identity and access.

Operations console

AreaWhat it controls
TodayCapability-aware service summary and recent activity
MessagesPrivate WhatsApp ledger, attachment review, and connected-group capture selection
ProgramsEvent intake, source batches, reconciliation, duplicates, history, flyers, note previews, and publication
BulletinNotice and knowledge review, official PDF sources, deterministic search, Ask preview, and publication
PeopleSubscribers, resident snapshots/history, import, token lifecycle, and email actions
ReliabilitySystem state, observability, replay, funnel, cohort, and latency views
ToolsEmail templates, Calendar Note Studio, bulk operations, and test delivery
AccessPeople, reusable roles, exact permission snapshots, view-as, contact configuration, and audit

The interface hides controls outside the returned capability projection, but the server independently enforces every request. Operator view-as is read-only, audited, bounded to reviewed human identities, and never unions the actor’s permissions with the target’s.

Detailed documentation

PageWhat it covers
Resident guideSubscribing, managing a subscription, and fixing refresh problems
ArchitectureLayers, request routing, credential boundaries, and fail-closed behavior
Origin boundaryWhy human pages and stable private feeds use different hostnames
Happenings intakeHow a forwarded newsletter becomes reviewable content
Event reviewSource triage, duplicates, flyers, publication, and Pub sharing
BulletinReviewed notices and public knowledge behavior
Programs ICS generationDeterministic rendering from D1 into R2
Scheduler WorkerLease protocol and bounded rebuild capability
Subscription lifecycleVerification, handoff, renewal, win-back, and revocation
IntegrationsEmail, anti-abuse, intakes, projections, and retired dependencies
API referencePublic, resident, machine, and permission-protected routes
Data modelD1 migrations, role and audit storage, knowledge stores, and R2 objects
Operations referenceCurrent console destinations and their capability boundaries
Operations guideLocal checks, migration isolation, deployment, and troubleshooting

5 items under this folder.