Skip to main content

Developer Page Specifications

Status Logic

Open / ClosingSoon / Rolling / Closed computation rules + sponsored/verified stored flags.

Complete

Status is computed, not stored — with one exception. The four primary statuses (Open / ClosingSoon / Rolling / Closed) derive from DeadlineDate + IsRolling at every read. IsSponsored and IsVerified are stored boolean flags set by admin. A nightly job persists computed status to the column for fast filtering, but every read still recomputes to defend against drift.

Computed statuses

Open
IsRolling = false AND DeadlineDate > NOW() + INTERVAL '7 days'. Default state for a verified future opportunity with a deadline more than a week away.
ClosingSoon
IsRolling = false AND DeadlineDate BETWEEN NOW() AND NOW() + INTERVAL '7 days'. Triggers warning tint + "Closing soon" pill + upgraded CTA label "Apply (closing soon)".
Rolling
IsRolling = true. DeadlineDate is ignored. Cards render with the purple accent and "Rolling applications" label.
Closed
IsRolling = false AND DeadlineDate < NOW(). Cards desaturate to 60% opacity, "Apply" CTA disables. Filter-excluded from default Status=all view; appear only when user explicitly filters Status=closed.

Stored editorial flags

IsSponsored
Stored boolean. Set when a commercial sponsorship covers this opportunity placement. Renders "SPONSORED" pill + sponsor disclosure ribbon at the top of the details body. Editorial standard still applies — sponsorship buys placement, not relaxed fact-check.
IsVerified
Stored boolean. Set after the 3-gate editorial verification passes (source authority · detail accuracy · ecosystem relevance — see §9.6 verification doctrine). Drives the green ✓ chip.

Configurability

  • ClosingSoon window default = 7 days. Configurable via FeatureFlag.opportunityClosingSoonDays (admin can change to 5 or 14 globally).
  • Closed auto-archive cutoff = 180 days after DeadlineDate. After that, the row stays IsActive=true and queryable, but moves to a separate "archive" admin surface and is excluded from listing by default.

Timezone considerations

DeadlineDate is always stored in UTC (timestamptz). Display logic converts to the viewer’s locale. BUT status computation always uses UTC NOW() — never the viewer’s clock. A founder in Cairo at 11:55pm sees the same Closed state as a founder in San Francisco at 12:55pm UTC. This matters for fairness — every applicant globally sees the same window close at the same instant.