Skip to content

Track 3 · Your Media-Savvy Startup

Pravaha, for judges

Pravaha turns lecture recordings into knowledge you can ask. Every answer is a clip of the teacher saying it, and the clip, the reel, the share card and the Hindi subtitles are all Cloudinary. This page maps that to the submission requirements.

The requirements, and where they are met

Cloudinary is an active part of the product
Media in is raw video; transcripts, chapters, streams, clips, reels, cards and tags all come from Cloudinary. Without it there is no product.
Upload, manage, transform, optimize, search, deliver
Signed upload · tags and context · Search API · splice, crop, caption, preview transformations · f_auto/q_auto · HLS delivery.
A live working demo
This site. Six real NPTEL sessions, no login for learners.
Public repo with setup instructions
github.com/Monolithic-Dev/Pravaha, SETUP.md.
It is monitored, and a real business
/status shows live database, AI model and Cloudinary-credit health. The business case is in docs/BUSINESS.md and the README.
README: track, problem, Cloudinary usage, how to test
Track 3 (Your Media-Savvy Startup); see the README.

Test it in 90 seconds

  1. 1Ask · Type: “What is the bias-variance trade-off?” The answer cites clips; open one. Try it in Hindi: “ओवरफिटिंग क्या है?”
  2. 2Watch the answer · Tap “Watch the answer”: moments from different lecturers as one Cloudinary-edited video.
  3. 3Compare teachers · Open the Overfitting concept: three lecturers, one video.
  4. 4Build a course · Ask for “Choosing a learning rate”: a 4-step course, one video.
  5. 5Share a Moment · On any clip tap “Share as Moment”: vertical, speaker-tracked, captioned.
  6. 6See the proof · Open “Cloudinary under the hood” at the bottom of a session, answer or concept.

15 Cloudinary capabilities in use

  • Signed upload preset + Upload Widget

    Browser-to-Cloudinary video upload with real progress; the server only signs.

    See it: Studio, /try · src/app/api/upload-signature/route.ts

  • auto_transcription

    Word-timed transcript at upload: the corpus for Find, Ask and subtitles.

    See it: Watch → Transcript · src/lib/ingest.ts

  • auto_chaptering

    AI chapters on the seek bar and as search context.

    See it: Watch → Chapters · src/lib/chapters.ts

  • Translated transcripts (hi-IN)

    Hindi subtitles generated by Cloudinary, plus asking in Hindi.

    See it: Watch → subtitles menu · src/lib/subtitles.ts

  • Video Player + HLS streaming profile

    Adaptive 720p/360p/180p ladder that survives slow mobile data.

    See it: Any session · src/components/Player.tsx

  • e_preview + fl_getinfo + fl_sprite

    AI highlights graph, seek-bar thumbnails and 6-second hover previews.

    See it: Library cards, Watch · src/lib/media.ts

  • so_/eo_ trims + c_fill,ar_9:16,g_auto

    Moments: any sentence becomes a vertical clip that tracks the speaker.

    See it: Share as Moment · src/lib/media.ts

  • Timed l_text layers

    Word-accurate burned-in captions and speaker labels, exact on trimmed clips.

    See it: Moments, reels · src/lib/media.ts

  • l_video + fl_splice

    Answer Reels, Study Pack reels, Learning Paths and Compare Reels: moments from many sessions as one video.

    See it: Ask, /learn, /concepts · src/lib/media.ts

  • g_auto thumbnails + gradient/text share cards

    Open Graph images for every moment, answer, course and concept: one URL, no image service.

    See it: /m, /a, /p, /concepts · src/lib/media.ts

  • f_auto, q_auto

    Best format and quality for each device on every derived asset.

    See it: Everywhere · src/lib/media.ts

  • Notification webhooks (signed)

    Upload to ready with no polling; signature and replay window verified.

    See it: Studio status · src/lib/webhook-signature.ts

  • Incoming transformation eo_60

    Public trial uploads keep only 60 seconds, so abuse cannot cost more.

    See it: /try · src/lib/trial-policy.ts

  • Tags + contextual metadata

    Each asset carries its concepts, speaker and language inside Cloudinary.

    See it: Studio → Cloudinary asset index · src/lib/cloudinary-index.ts

  • Search API

    Reads the tagged assets back from Cloudinary itself.

    See it: Studio → Cloudinary asset index · src/lib/cloudinary-index.ts

Live Cloudinary URLs

Generated from the real library right now. Open any of them.

The URLs behind this library10 Cloudinary URLs make this page. No render servers: each one is generated on request and cached.
  • Adaptive streaming

    The player's HLS stream: Cloudinary encodes a ladder of renditions on demand and the player switches with the connection.

    Open ↗

    …/video/upload/q_auto/sp_hd_lean/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.m3u8

    q_auto
    AI-chosen quality: smallest file that still looks right
    sp_hd_lean
    adaptive streaming profile "hd_lean": a ladder of renditions the player switches between
  • Transcript (auto_transcription)

    Word-timed transcript written by Cloudinary at upload. Pravaha indexes it for Find and Ask and uses it for subtitles.

    Open ↗

    …/raw/upload/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.transcript

  • Seek-bar previews

    One sprite of frames for the thumbnails you see while scrubbing.

    Open ↗

    …/video/upload/q_auto/sp_hd_lean/fl_sprite/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.vtt

    q_auto
    AI-chosen quality: smallest file that still looks right
    sp_hd_lean
    adaptive streaming profile "hd_lean": a ladder of renditions the player switches between
    fl_sprite
    a sprite of frames for seek-bar thumbnails
  • AI highlights graph

    Cloudinary's AI rates which parts are most interesting; the player draws it above the seek bar.

    Open ↗

    …/video/upload/e_preview,fl_getinfo/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c

    e_preview
    AI preview: finds the most interesting parts of the video
    fl_getinfo
    returns data about the video instead of the video
  • Poster frame

    A frame 10% in, cropped to 16:9 around the speaker by AI, in the best format for your device.

    Open ↗

    …/video/upload/so_15.5,c_fill,ar_16:9,w_640,g_auto/f_auto,q_auto/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.jpg

    so_15.5
    starts at 15.5 s
    c_fill
    crops to fill the frame exactly
    ar_16:9
    aspect ratio 16 : 9
    w_640
    640 px wide
    g_auto
    AI picks the focus (the speaker or slide), not a blind centre crop
    f_auto
    best format for each device (e.g. AV1, WebM, MP4, WebP)
    q_auto
    AI-chosen quality: smallest file that still looks right
  • Link preview card

    The image WhatsApp, LinkedIn and Slack show for this page: a frame, a fade and text layers, all in one URL.

    Open ↗

    …/video/upload/so_15.5,c_fill,w_1200,h_630,g_auto/e_gradient_fade:symmetric_pad,y_-0.5,b_black/l_text:arial_30_bold:Pravaha,co_white,b_rgb:0f766e/fl_layer_apply,g_north_west,x_60,y_56/fl_layer_apply,g_south_west,x_60,y_70/f_jpg,q_auto/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.jpg

    so_15.5
    starts at 15.5 s
    c_fill
    crops to fill the frame exactly
    w_1200
    1200 px wide · and 1 more like it
    h_630
    630 px tall
    g_auto
    AI picks the focus (the speaker or slide), not a blind centre crop
    e_gradient_fade:symmetric_p…
    fades the image edges so text on top stays readable
    y_-0.5
    -0.5 px from the edge
    b_black
    background black
    l_text:arial_30_bold:Pravaha
    text layer “Pravaha” · and 2 more like it
    co_white
    text colour white · and 1 more like it
    b_rgb:0f766e
    background #0f766e
    fl_layer_apply
    places the layer defined just before · and 2 more like it
    g_north_west
    anchored to the top-left corner
    x_60
    60 px from the side · and 2 more like it
    y_56
    56 px from the edge · and 2 more like it
    c_fit
    fits inside the box
    g_south_west
    anchored to the bottom-left corner · and 1 more like it
    co_rgb:99f6e4
    text colour #99f6e4
    f_jpg
    JPG format
    q_auto
    AI-chosen quality: smallest file that still looks right
  • A Moment (vertical short)

    What "Share this moment" makes at 0:30: trimmed, cropped to 9:16 following the speaker, with word-timed captions burned in. The first open can take a few seconds while Cloudinary analyses the video.

    Open ↗

    …/video/upload/so_29,eo_44/c_fill,ar_9:16,w_720,g_auto/l_text:arial_46_bold:sum%20of%20the%20squares,co_white,b_rg…/fl_layer_apply,g_south,y_220,so_1.5,eo_2.2/fl_layer_apply,g_south,y_220,so_12,eo_13.7/f_auto:video,q_auto/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.mp4

    so_29
    starts at 29 s · and 9 more like it
    eo_44
    ends at 44 s · and 9 more like it
    c_fill
    crops to fill the frame exactly
    ar_9:16
    aspect ratio 9 : 16 (vertical, for Reels and Shorts)
    w_720
    720 px wide · and 9 more like it
    g_auto
    AI picks the focus (the speaker or slide), not a blind centre crop
    l_text:arial_46_bold:sum%20…
    text layer “sum of the squares” · and 8 more like it
    co_white
    text colour white · and 8 more like it
    b_rgb:000000b3
    background #000000b3 · and 8 more like it
    c_fit
    fits inside the box · and 8 more like it
    fl_layer_apply
    places the layer defined just before · and 8 more like it
    g_south
    anchored to the bottom · and 8 more like it
    y_220
    220 px from the edge · and 8 more like it
    f_auto:video
    best format for each device (e.g. AV1, WebM, MP4, WebP)
    q_auto
    AI-chosen quality: smallest file that still looks right
  • Session in 60 seconds

    The Study Pack's highlight reel: 5 AI-picked moments stitched into one labelled video with fl_splice.

    Open ↗

    …/video/upload/so_0,eo_16.6,w_1280,h_720,c_fill/l_video:pravaha:1ba747ae-bdb0-43b5-bd11-8a0eda32a02c,fl_spl…/so_14,eo_31.9,w_1280,h_720,c_fill/fl_layer_apply/fl_layer_apply/f_auto:video,q_auto/pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c.mp4

    so_0
    starts at 0 s · and 4 more like it
    eo_16.6
    ends at 16.6 s · and 4 more like it
    w_1280
    1280 px wide · and 4 more like it
    h_720
    720 px tall · and 4 more like it
    c_fill
    crops to fill the frame exactly · and 4 more like it
    l_video:pravaha:1ba747ae-bd…
    another video (pravaha/1ba747ae-bdb0-43b5-bd11-8a0eda32a02c) as a layer · and 3 more like it
    fl_splice
    joins the next clip onto the end of this one · and 3 more like it
    fl_layer_apply
    places the layer defined just before · and 3 more like it
    f_auto:video
    best format for each device (e.g. AV1, WebM, MP4, WebP)
    q_auto
    AI-chosen quality: smallest file that still looks right
  • Compare reel

    3 explanations of this concept, from different sessions, spliced into one video with fl_splice. Each clip is labelled with its speaker.

    Open ↗

    …/video/upload/so_0,eo_15.8,w_1280,h_720,c_fill/l_video:pravaha:56db377d-a244-4533-b61d-2be05387727b,fl_spl…/so_147.7,eo_165.6,w_1280,h_720,c_fill/fl_layer_apply/fl_layer_apply,g_north_west,x_40,y_40,so_33.7,eo_46.1/f_auto:video,q_auto/pravaha/e35b9255-3117-4881-98cb-f7b89dc4d1cc.mp4

    so_0
    starts at 0 s · and 5 more like it
    eo_15.8
    ends at 15.8 s · and 5 more like it
    w_1280
    1280 px wide · and 2 more like it
    h_720
    720 px tall · and 2 more like it
    c_fill
    crops to fill the frame exactly · and 2 more like it
    l_video:pravaha:56db377d-a2…
    another video (pravaha/56db377d-a244-4533-b61d-2be05387727b) as a layer
    fl_splice
    joins the next clip onto the end of this one · and 1 more like it
    fl_layer_apply
    places the layer defined just before · and 4 more like it
    l_video:pravaha:ff809418-97…
    another video (pravaha/ff809418-9768-43d9-ab11-dd64c8941e4d) as a layer
    l_text:arial_34_bold:1%20%C…
    text layer “1 · Prof. Prabir Kumar Biswas” · and 2 more like it
    co_white
    text colour white · and 2 more like it
    b_rgb:0f766ecc
    background #0f766ecc · and 2 more like it
    g_north_west
    anchored to the top-left corner · and 2 more like it
    x_40
    40 px from the side · and 2 more like it
    y_40
    40 px from the edge · and 2 more like it
    f_auto:video
    best format for each device (e.g. AV1, WebM, MP4, WebP)
    q_auto
    AI-chosen quality: smallest file that still looks right
  • Explanation thumbnail

    The frame at that moment, cropped around the speaker by AI.

    Open ↗

    …/video/upload/so_0.1,c_fill,ar_16:9,w_640,g_auto/f_auto,q_auto/pravaha/e35b9255-3117-4881-98cb-f7b89dc4d1cc.jpg

    so_0.1
    starts at 0.1 s
    c_fill
    crops to fill the frame exactly
    ar_16:9
    aspect ratio 16 : 9
    w_640
    640 px wide
    g_auto
    AI picks the focus (the speaker or slide), not a blind centre crop
    f_auto
    best format for each device (e.g. AV1, WebM, MP4, WebP)
    q_auto
    AI-chosen quality: smallest file that still looks right