Skip to content

Work / Scrvio / Architecture

Scrvio architecture

A website that records the screen in the browser. A signed-in user's video goes straight from the browser to an S3 bucket; the server only signs the upload and keeps the records. A Team can point this at its own bucket, so it pays AWS for storage and transfer itself.

last verified 2026-10-30

Known cost a month
Not read
No bill is in the repo. The wiki gives Vercel a list range of $0 to $20; the API host, Postgres, S3, CloudFront and SES are not priced anywhere.
What makes cost grow
Minutes recorded
Every signed-in upload lands in our S3 bucket on every plan, free included. Storage and viewer transfer grow with it.

How it fits together

Pick something a user does to see its path and what it costs.

In the browserOur serversOutside servicesA team's own bucketWebsite and recorderWebsite and recorderNext.js on Vercel. Records with the browser, and works signed out$0–20 / mo listAPIAPINestJS GraphQL in one container, port 4000. Signs uploads and checks plansPostgres 16Postgres 16Users, workspaces, recording records, links, plan, storage settingsNot readScrvio S3 bucketScrvio S3 bucketHolds video for Free, Pro and Team on Scrvio Cloud. Played back through CloudFrontNot readTeam's own S3Team's own S3Team pays AWSPolarPolarPro $14 a month; Team $29 a seat a month. Webhook is the only writer of the planNot readAWS SESAWS SESNot readGoogle sign-in and PostHogGoogle sign-in and PostHogOAuth login; product eventsNot read
Not read
storage per GB, plus viewer transfer later; no rate in the repo
  1. The browser records. Free is capped at 5 minutes.
  2. The browser asks the API to register the recording.
  3. The API returns a signed upload link, good for 15 minutes.
  4. The browser sends the video straight to S3. It does not pass through the API.
  5. The browser asks the API to complete. The API checks the plan, then asks S3 whether the file exists.
  6. If any step fails, the user sees a toast and the video downloads to their machine.

Cost

Every number says where it came from.

ServicePays forTodayGrows withBasis
Website and recorderNext.js on Vercel. Records with the browser, and works signed out$0–20 a month, a list price and not a billNot statedStatedwiki/concepts/architecture.md (before this page); ops/release.yml names Vercel
Postgres 16Users, workspaces, recording records, links, plan, storage settingsNot readRowsNot known
Scrvio S3 bucketHolds video for Free, Pro and Team on Scrvio Cloud. Played back through CloudFrontNot readStored GB and viewer transfer. Plans include 500 MB, 25 GB, 100 GBNot known
Team's own S3Paid by the team to AWS. $2 a month BYOB fee is copy only, nothing charges itThe team's recorded minutesStatedwiki/entities/plans.md PLAN.TEAM.BYOB; wiki/entities/storage-providers.md
PolarPro $14 a month; Team $29 a seat a month. Webhook is the only writer of the planNot readSubscription revenueNot known
AWS SESNot readEmails sentNot known
Google sign-in and PostHogOAuth login; product eventsNot readNot statedNot known

What breaks when something fails

If this failsThe user seesTheir dataBasis
Website and recorderNobody can record or open a link. The API keeps running.Nothing is held on Vercel.AssumedReasoned from apps/website/vercel.json; not tested
APISign-in, library, uploads and links stop. A signed-out recording still downloads, because it never touches the server.Recordings already in S3 are safe. A video already uploaded but not completed has no record.In codeapps/website/src/app/app/page.tsx; apps/server/src/api/03-recording/recording-upload.service.ts
Postgres 16The API cannot answer. The health check fails.Not written down. Backups are not named anywhere in the repo.Not known
Scrvio S3 bucketThe upload fails. The user sees a toast and the file downloads to their machine instead.The video is kept on their machine only.In codeapps/website/src/app/app/page.tsx onError; s3.provider.ts
Team's own S3That team's uploads fail and fall back to a local download. Other workspaces are not touched.Stays in the team's account.In codeprivate-cloud.provider.ts verifyUploadComplete; app/page.tsx
PolarCheckout fails. Current plans keep working.If a webhook fails the server answers 500 and Polar retries.In codeapps/server/src/lib/polar/webhook.controller.ts
AWS SESThe email never arrives and nothing tells the user. The server still reports success.None held.In codeapps/server/src/lib/email/email.service.ts send() catches and logs
Google sign-in and PostHogNot written down.Not written down.Not known

Where the data goes

Recording videoScrvio's S3 bucket, or a Team's own bucket; signed-out recordings stay on the user's machine
Account, workspace, recording records, link settingsPostgres
Payments and invoicesPolar; plan and invoice records in Postgres
Usage eventsPostHog

What we do not know yet

  • Hosting is being migrated (owner, 2026-10-30): off Vercel, onto one small server running the API and website in containers (wiki/decisions/hosting.md). Which server is not named there. Costs here are before the move.
  • The real monthly bill: no host, database, S3, CloudFront, SES or Polar cost is recorded. Only Vercel has a list range.
  • Where the API and Postgres run, and whether production exists at all. ops/release.yml says the API host is not named and nothing but the web page was checked.
  • What happens when the BYOB $2 a month fee is due: nothing charges it.