Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<div align="center">

<img src="docs/devpost/thumbnail.png" alt="GRIDPRINT: the power grid is the witness" width="820">

# GRIDPRINT

**Checks that a video is real by reading the power grid in the flicker of the room lights.**
Expand Down
52 changes: 32 additions & 20 deletions docs/VIDEO_SCRIPT.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# GRIDPRINT submission video: script

Generated by `video/make_pitch.py`. Voice: edge-tts `en-US-AndrewNeural` (rate +0%). Duration: 195.4 s. <!-- src: results/video/duration.json#duration_s -->
Generated by `video/make_pitch.py`. Voice: edge-tts `en-US-AndrewNeural` (rate +0%). Duration: 223.2 s. <!-- src: results/video/duration.json#duration_s -->
Style: ASD-STE100 Simplified Technical English (short sentences, active voice, one idea per sentence).

Sources on screen: live AWS app screenshots (`video/assets/live/`, captured with headless Chrome), `data/public/fluorescent_beat_effect.mp4` (Wikimedia Commons, CC BY-SA 3.0), engine outputs in `results/video/engine_runs/`, agent trace `results/agent_traces/clean__s1001.json`, benchmark `results/bench/2026-10-27/`. <!-- src: results/bench/2026-10-27/cost.json#configs -->
Sources on screen: live AWS app screenshots (`video/assets/live/`, captured with headless Chrome), `data/public/fluorescent_beat_effect.mp4` (Wikimedia Commons, CC BY-SA 3.0), engine outputs in `results/video/engine_runs/`, agent trace `results/agent_traces/clean__s1001.json`, benchmark `results/bench/2026-10-27/`, real iPhone 13 clip `data/real/phone2.mov` with engine run `results/video/engine_runs/real-phone2/` and live job `cd65b6ea0c20`. <!-- src: results/bench/2026-10-27/cost.json#configs -->

## 01 THE PROBLEM / hook (00:00:00 - 00:00:07)

Expand Down Expand Up @@ -54,53 +54,65 @@ Sources on screen: live AWS app screenshots (`video/assets/live/`, captured with
- Then it slides that track along the grid reference log.
- One clear match gives a recording time. A cut or an insertion breaks the match.

## 04 THE PRODUCT / home (00:01:27 - 00:01:36)
## 04 REAL EVIDENCE / realclip (00:01:27 - 00:01:36)

- We filmed a real room with a normal phone.
- This is an iPhone 13 video, recorded today under indoor mains light in India.

## 04 REAL EVIDENCE / realrun (00:01:36 - 00:01:45)

- The OpenCV 5 engine measured the full clip.
- It found no clean flicker in this clip.
- So GRIDPRINT said INCONCLUSIVE. It did not guess.

## 04 REAL EVIDENCE / reallive (00:01:45 - 00:01:56)

- We also ran the same clip live on AWS.
- Then the live agent asked the user one question: which camera made this video?
- A missing signal never counts against a video.

## 05 THE PRODUCT / home (00:01:56 - 00:02:05)

- GRIDPRINT runs live on AWS today. This is the web app.
- You upload a video. You can add a claimed grid zone and a claimed recording time.

## 04 THE PRODUCT / cases (00:01:36 - 00:01:42)
## 05 THE PRODUCT / cases (00:02:05 - 00:02:12)

- Ready-made example cases run through the same live pipeline.
- One click starts a full analysis job.

## 04 THE PRODUCT / job (00:01:42 - 00:01:55)
## 05 THE PRODUCT / job (00:02:12 - 00:02:24)

- Here is a finished job. The verdict is VERIFIED, and the report is final.
- The page shows the estimated recording time and its uncertainty.
- Each verdict comes with reason codes in plain words.

## 04 THE PRODUCT / trace (00:01:55 - 00:02:02)
## 05 THE PRODUCT / trace (00:02:24 - 00:02:32)

- An agent plans each analysis.
- It calls engine tools through an MCP server, and it logs every step.

## 04 THE PRODUCT / reviewer (00:02:02 - 00:02:09)
## 05 THE PRODUCT / reviewer (00:02:32 - 00:02:39)

- A CONTRADICTED result is never final on its own.
- A human reviewer must approve it first.

## 04 THE PRODUCT / limits (00:02:09 - 00:02:15)

- The limitations page tells users what GRIDPRINT cannot do.
- Clear limits are part of the product.

## 05 BUILT ON AWS / arch (00:02:15 - 00:02:48)
## 06 BUILT ON AWS / arch (00:02:39 - 00:03:20)

- A video arrives through API Gateway and a load balancer.
- An API service on Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue.
- Workers on Graviton4 run the OpenCV 5 engine in fifteen stages.
- A video arrives through API Gateway and an Application Load Balancer.
- An API service on AWS Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue.
- Workers on Amazon ECS with Graviton4 run the OpenCV 5 engine in fifteen stages.
- An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies.
- DynamoDB keeps jobs and the grid log. IoT Core brings in grid data. Cognito signs in reviewers.
- DynamoDB keeps jobs and the grid log. IoT Core and Lambda bring in grid data.
- Cognito signs in reviewers. CloudWatch watches the system, and the AWS CDK deploys it all.

## 05 BUILT ON AWS / bench (00:02:48 - 00:02:58)
## 06 BUILT ON AWS / bench (00:03:20 - 00:03:29)

- We measured the same engine on Graviton and on x86.
- Graviton processed more video per second, at a lower cost per video hour.

## 06 THE VERDICT / close (00:02:58 - 00:03:14)
## 07 THE VERDICT / close (00:03:29 - 00:03:42)

- GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE.
- A missing signal never counts against a video.
- It needs mains lighting, and many phone videos will be INCONCLUSIVE.
- GRIDPRINT. Evidence from the light in the room.
Binary file removed docs/devpost/thumbnail.png
Binary file not shown.
Binary file added docs/media/01_title.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/02_problem.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/03_how_it_works.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/04_real_run.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/05_live_app_verdict.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/06_architecture.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions results/video/duration.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"file": "gridprint_submission.mp4",
"sha256": "58a9b27aaf043511cd3a3b179575b8263b2956375897c00b4a52a095e98f0e8b",
"duration_s": 195.433333,
"sha256": "5260e9f06fb10c3d252ecb9349b344d76d92910ebf210db9fdea1f8c4989c188",
"duration_s": 223.166667,
"limit_s": 300,
"ok": true,
"checked": "2026-10-27T05:24:38.693595+00:00"
"checked": "2026-10-27T06:31:05.694934+00:00"
}
118 changes: 71 additions & 47 deletions results/video/gridprint_submission.srt
Original file line number Diff line number Diff line change
Expand Up @@ -99,98 +99,122 @@ Then it slides that track along the grid reference log.
One clear match gives a recording time. A cut or an insertion breaks the match.

26
00:01:27,494 --> 00:01:31,284
GRIDPRINT runs live on AWS today. This is the web app.
00:01:27,494 --> 00:01:29,609
We filmed a real room with a normal phone.

27
00:01:31,704 --> 00:01:35,764
You upload a video. You can add a claimed grid zone and a claimed recording time.
00:01:30,029 --> 00:01:35,507
This is an iPhone 13 video, recorded today under indoor mains light in India.

28
00:01:36,764 --> 00:01:39,953
Ready-made example cases run through the same live pipeline.
00:01:36,507 --> 00:01:39,272
The OpenCV 5 engine measured the full clip.

29
00:01:40,373 --> 00:01:42,321
One click starts a full analysis job.
00:01:39,692 --> 00:01:41,513
It found no clean flicker in this clip.

30
00:01:43,321 --> 00:01:47,573
Here is a finished job. The verdict is VERIFIED, and the report is final.
00:01:41,933 --> 00:01:45,254
So GRIDPRINT said INCONCLUSIVE. It did not guess.

31
00:01:47,993 --> 00:01:51,500
The page shows the estimated recording time and its uncertainty.
00:01:46,254 --> 00:01:48,774
We also ran the same clip live on AWS.

32
00:01:51,920 --> 00:01:54,722
Each verdict comes with reason codes in plain words.
00:01:49,194 --> 00:01:53,437
Then the live agent asked the user one question: which camera made this video?

33
00:01:55,722 --> 00:01:57,659
An agent plans each analysis.
00:01:53,857 --> 00:01:56,118
A missing signal never counts against a video.

34
00:01:58,079 --> 00:02:02,353
It calls engine tools through an MCP server, and it logs every step.
00:01:57,118 --> 00:02:00,908
GRIDPRINT runs live on AWS today. This is the web app.

35
00:02:03,353 --> 00:02:06,252
A CONTRADICTED result is never final on its own.
00:02:01,328 --> 00:02:05,388
You upload a video. You can add a claimed grid zone and a claimed recording time.

36
00:02:06,672 --> 00:02:08,781
A human reviewer must approve it first.
00:02:06,388 --> 00:02:09,577
Ready-made example cases run through the same live pipeline.

37
00:02:09,781 --> 00:02:13,295
The limitations page tells users what GRIDPRINT cannot do.
00:02:09,997 --> 00:02:11,945
One click starts a full analysis job.

38
00:02:13,715 --> 00:02:15,254
Clear limits are part of the product.
00:02:12,945 --> 00:02:17,197
Here is a finished job. The verdict is VERIFIED, and the report is final.

39
00:02:16,254 --> 00:02:19,867
A video arrives through API Gateway and a load balancer.
00:02:17,617 --> 00:02:21,123
The page shows the estimated recording time and its uncertainty.

40
00:02:20,287 --> 00:02:27,030
An API service on Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue.
00:02:21,543 --> 00:02:24,345
Each verdict comes with reason codes in plain words.

41
00:02:27,450 --> 00:02:32,542
Workers on Graviton4 run the OpenCV 5 engine in fifteen stages.
00:02:25,345 --> 00:02:27,283
An agent plans each analysis.

42
00:02:32,962 --> 00:02:40,429
An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies.
00:02:27,703 --> 00:02:31,977
It calls engine tools through an MCP server, and it logs every step.

43
00:02:40,849 --> 00:02:47,867
DynamoDB keeps jobs and the grid log. IoT Core brings in grid data. Cognito signs in reviewers.
00:02:32,977 --> 00:02:35,876
A CONTRADICTED result is never final on its own.

44
00:02:48,867 --> 00:02:52,443
We measured the same engine on Graviton and on x86.
00:02:36,296 --> 00:02:38,404
A human reviewer must approve it first.

45
00:02:52,863 --> 00:02:57,478
Graviton processed more video per second, at a lower cost per video hour.
00:02:39,404 --> 00:02:43,734
A video arrives through API Gateway and an Application Load Balancer.

46
00:02:58,478 --> 00:03:04,149
GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE.
00:02:44,154 --> 00:02:51,621
An API service on AWS Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue.

47
00:03:04,569 --> 00:03:06,830
A missing signal never counts against a video.
00:02:52,041 --> 00:02:58,525
Workers on Amazon ECS with Graviton4 run the OpenCV 5 engine in fifteen stages.

48
00:03:07,250 --> 00:03:10,866
It needs mains lighting, and many phone videos will be INCONCLUSIVE.
00:02:58,945 --> 00:03:06,412
An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies.

49
00:03:11,286 --> 00:03:13,837
00:03:06,832 --> 00:03:12,693
DynamoDB keeps jobs and the grid log. IoT Core and Lambda bring in grid data.

50
00:03:13,113 --> 00:03:19,648
Cognito signs in reviewers. CloudWatch watches the system, and the AWS CDK deploys it all.

51
00:03:20,648 --> 00:03:24,224
We measured the same engine on Graviton and on x86.

52
00:03:24,644 --> 00:03:29,259
Graviton processed more video per second, at a lower cost per video hour.

53
00:03:30,259 --> 00:03:35,931
GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE.

54
00:03:36,351 --> 00:03:38,612
A missing signal never counts against a video.

55
00:03:39,032 --> 00:03:41,582
GRIDPRINT. Evidence from the light in the room.

Loading