Skip to main content
home35 Designs
All workPlatform

EMGravity Research Portal

The EMGravity Research Portal is the members' side of an independent research program's website. Members apply and are approved before they see any data, the lab's data logger uploads each run and build straight to the portal, outside referees review and sign off on them, and the lab's live stream runs alongside the data.

EMGravity brand guidelines page with the logo on a starfield

At a glance

Type
Platform
Industry
Research
Built with
Next.js 14, Prisma on Postgres (Neon), Clerk, Vercel Blob, Recharts, Resend
Timeline
April to June 2026, 91 commits
Codebase
About 17,000 lines of TypeScript, 32 pages, 14 API routes and 8 data models

Who gets in

Visitors create an account with Clerk, then apply with their name, role and reason for joining. Until an admin approves them they see a pending page, and admins can also deny an application or revoke access later. Approval lives in the account's metadata and is checked on every gated page.

Referees are the program's outside reviewers. An admin promotes a member to referee, the referee sets up a public profile with a photo, and from then on can comment on any run or build and give it an approve or disapprove verdict. A disapproval needs a reason, and a new verdict replaces that referee's previous one.

The screenshots show the public site; the portal itself is members-only.

  • EMGravity brand guidelines page with the logo on a starfield
  • Contact page with an inquiry form

From the bench to the portal

The data logger uploads each run as one bundle through an API authenticated by a shared secret, compared in constant time. Photos and videos go straight to Vercel Blob with short-lived upload tokens, so large files never pass through a server function.

Uploads are keyed by run number, so a re-upload updates the run in place inside one transaction. New runs stay unpublished until an admin reviews them, and when the logger deletes a build, the portal deletes it too, so the two never drift apart.

Each run's readings are charted in the browser. The lab stream carries a live badge from a server-side check cached for 30 seconds, and a heartbeat-based counter shows how many people are watching.

Highlights

  • A logger upload API with constant-time secret checks and direct-to-storage media uploads.
  • Transactional re-uploads keyed by run number, so a run is never left half-updated.
  • An approval workflow and referee role built on account metadata, checked on every gated page.

Let's talk.

Tell me what you're building. I read every message myself and usually reply within one business day.