A beautiful, modern web interface for generating AI videos with OpenAI's Sora API
Features β’ Quick Start β’ Demo β’ Documentation
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Sora Studio βοΈ Settings β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β Create Video β π Dashboard β πΌοΈ Gallery β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π Prompt: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β A golden retriever puppy playing in a field β β
β β of colorful wildflowers at sunset β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β π¬ Model: sora-2 β
β β
β β±οΈ Duration: [4s] [6s] [8s] β
β β
β π Resolution: β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Portrait β β Tall β βLandscape β β Wide β β
β β 720x1280 β β1024x1808 β β1280x720 β β1808x1024 β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β
β π Optional Reference: [Upload Image/Video] β
β β
β [πͺ Generate Video] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Video Jobs [Filter βΌ] [Search] [π] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β±οΈ Auto-refreshing every 10 seconds [βΈοΈ Pause] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π’ completed video_abc123 β
β "A golden retriever puppy playing..." β
β π
10/7/2025, 2:11 PM β π¬ 8s β π 1280x720 β
β Progress: ββββββββββββββββββββ 100% β
β [ποΈ Details] [β¬οΈ Download] [π Remix] [ποΈ Delete] β
β β
β π΅ processing video_xyz789 β
β "Ocean waves crashing..." β
β π
10/7/2025, 2:15 PM β π¬ 6s β π 720x1280 β
β Progress: ββββββββββββββββββββ 45% β
β [ποΈ Details] [ποΈ Delete] β
β β
β π‘ queued video_def456 β
β "Time-lapse of clouds..." β
β π
10/7/2025, 2:16 PM β π¬ 4s β π 1024x1808 β
β Progress: ββββββββββββββββββββ 0% β
β [ποΈ Details] [ποΈ Delete] β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Completed Videos [π₯ Export History]β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β π¬ VIDEO β β π¬ VIDEO β β π¬ VIDEO β β
β β PLAYS β β PLAYS β β PLAYS β β
β β ON LOAD β β ON LOAD β β ON LOAD β β
β ββββββββββββ€ ββββββββββββ€ ββββββββββββ€ β
β β Prompt: β β Prompt: β β Prompt: β β
β β A golden β β Ocean β β Time- β β
β β retrieverβ β waves... β β lapse... β β
β β π
10/7 β β π
10/7 β β π
10/7 β β
β β π¬ 8s β β π¬ 6s β β π¬ 4s β β
β β[β¬οΈ][π] β β[β¬οΈ][π] β β[β¬οΈ][π] β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β
β β Hover over videos to hear audio! β β
β β Click to view full details β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Text-to-Video - Transform descriptions into videos
- Multiple Durations - Choose 4, 6, or 8 seconds
- 4 Resolutions - Portrait, Landscape, and HD options
- Reference Upload - Guide generation with images/videos
- Real-time Progress - Watch your video generate live
- Auto-refresh - Updates every 10 seconds automatically
- Status Tracking - Visual progress bars for each video
- Filter & Search - Find videos quickly
- Bulk Actions - Download, remix, or delete multiple videos
- Instant Thumbnails - See all videos in < 1 second
- Auto-play Previews - Videos load and play on hover
- Audio on Hover - Unmute by moving your mouse over
- One-click Actions - Download or remix directly
- Create Variations - Build on successful generations
- Prompt Evolution - Extend or modify existing videos
- Track History - See which videos are remixes
- API Key Storage - Persistent
.envfile support - Default Preferences - Set preferred duration and resolution
- Auto-refresh Control - Customize update interval
- Data Management - Export or clear job history
- Modern web browser (Chrome, Firefox, Safari, Edge)
- OpenAI API key with Sora access
- Python 3 (for local server)
1οΈβ£ Clone the repository
git clone https://github.com/yourusername/sora-studio.git
cd sora-studio2οΈβ£ Add your API key
# Edit .env file
nano .envAdd your key:
OPENAI_API_KEY=sk-your-api-key-here3οΈβ£ Start the server
# Make script executable
chmod +x scripts/start-server.sh
# Start server
./scripts/start-server.sh4οΈβ£ Open in browser
http://localhost:8000
That's it! π
You type a prompt β Click "Generate" β Job created
Example Prompts:
- "A golden retriever puppy playing in a field of flowers at sunset"
- "Ocean waves crashing against rocky cliffs during a storm"
- "Time-lapse of clouds moving across a vibrant sunset sky"
Dashboard shows:
βββ π‘ Queued (waiting to start)
βββ π΅ Processing (generating... 45%)
βββ π’ Completed (ready to download!)
Auto-refresh every 10 seconds - No manual clicking needed!
Video complete β Click "Download" β Save as MP4
Or "Remix" to create variations!
graph LR
A[Open App] --> B[Enter Prompt]
B --> C[Select Duration & Resolution]
C --> D[Click Generate]
D --> E[Job Created]
E --> F[Monitor Dashboard]
F --> G{Status?}
G -->|Processing| H[Wait & Watch Progress]
H --> F
G -->|Completed| I[Download Video!]
I --> J[Remix or Create New]
Step-by-step:
- Navigate to "Create Video" tab
- Enter your prompt - Be descriptive!
Example: "A close-up shot of a hummingbird hovering near a red hibiscus flower in slow motion with morning sunlight" - Choose settings:
- Duration: 4s (quick), 6s (standard), or 8s (extended)
- Resolution: Portrait (9:16) or Landscape (16:9)
- Optional: Upload reference image/video
- Click "Generate Video"
- Switch to Dashboard to monitor progress
| Endpoint | Purpose | When |
|---|---|---|
POST /videos |
Create video | User clicks "Generate" |
GET /videos/{id} |
Check status | Auto-refresh (every 10s) |
GET /videos |
List all videos | Dashboard load |
GET /videos/{id}/content |
Download video | User clicks "Download" |
POST /videos/{id}/remix |
Remix video | User clicks "Remix" |
DELETE /videos/{id} |
Delete video | User clicks "Delete" |
variant=thumbnail β Static image (instant load) πΈ
variant=video β Full MP4 file (for download) π¬
variant=spritesheet β Preview frames (future use) ποΈ
sora-studio/
βββ π index.html # Main UI (entry point)
βββ π .env # Your API key
βββ π README.md # This file
β
βββ π src/ # Source code
β βββ app.js # Application logic (40 KB)
β βββ config.js # Config loader (2 KB)
β
βββ π scripts/ # Utility scripts
β βββ start-server.sh # Server startup
β
βββ π docs/ # Documentation
βββ START_HERE.md # Quick start
βββ SETUP.md # Detailed setup
βββ openai-video-api-guide.md # API reference
Frontend:
- HTML5 - Structure
- Tailwind CSS - Styling
- Vanilla JavaScript - Logic
- Font Awesome - Icons
Backend:
- Python HTTP Server - Local hosting
- OpenAI API - Video generation
No framework needed! Pure HTML/CSS/JS for simplicity.
// Every 10 seconds:
Check for active jobs (queued or processing)
β
Fetch latest status from API
β
Update UI automatically
β
Show notification if completedBenefits:
- β No manual refresh needed
- β Real-time progress updates
- β Notifications when videos complete
- β Configurable interval (5-60s)
// Two-stage loading:
1. Load thumbnail (instant - 50KB)
β User sees content immediately
2. Load video in background (5-10MB)
β Ready when user hovers
3. Hover to play with audio
β Smooth playback, no delayPerformance:
- πΈ Thumbnails: < 1 second
- π¬ Full videos: Background loading
- π 20x faster than loading all videos upfront
Create variations of successful videos:
Original prompt:
"A cat playing piano on stage"
Remix prompt:
"Same scene but now the cat takes a bow to a cheering audience"
Result:
β New video building on the original!
| Status | Icon | Color | Meaning |
|---|---|---|---|
| Queued | π‘ | Yellow | Waiting to start |
| Processing | π΅ | Blue | Generating video |
| Completed | π’ | Green | Ready to download |
| Failed | π΄ | Red | Error occurred |
| Cancelled | βͺ | Gray | Job cancelled |
# .env file
OPENAI_API_KEY=sk-your-key-hereDefault Preferences:
- Duration: 4, 6, or 8 seconds
- Resolution: 720x1280, 1024x1808, 1280x720, 1808x1024
- Auto-refresh interval: 5-60 seconds
Data Management:
- Export job history as JSON
- Clear all local data
- API key management
Priority: .env file β localStorage
.env file (recommended):
- Stored locally
- Not committed to git (.gitignore)
- More secure for development
localStorage (fallback):
- Stored in browser
- Accessible to JavaScript
- Use .env instead
β Do:
- Store API key in
.envfile - Keep
.envin.gitignore - Use environment variables in production
- Implement backend proxy for public apps
β Don't:
- Commit API keys to GitHub
- Share your
.envfile - Use client-side keys in production
- Store keys in plain text in code
Good Prompt β
A close-up shot of a hummingbird hovering near a red hibiscus
flower. The scene is shot in slow motion with morning sunlight
creating a soft glow. The background is a blurred garden.
Bad Prompt β
bird and flower
Tips:
- Be specific and descriptive
- Include details about lighting, mood, camera angles
- Mention movement and action
- Specify time of day or weather
For testing:
- Use 4-second duration
- Use lower resolution (720x1280)
- Test prompts before full generation
For final videos:
- Use 8-second duration
- Use higher resolution (1808x1024)
- Generate after testing prompt
Organization:
- Delete old test videos
- Download important videos (they expire!)
- Use remix to iterate on good results
- Export history for backup
1. API Key Not Working
# Check your key
cat .env
# Should show: OPENAI_API_KEY=sk-...
# If empty, add your key2. Server Won't Start
# Make script executable
chmod +x scripts/start-server.sh
# Or run manually
python3 -m http.server 80003. Videos Not Auto-Refreshing
// Open browser console (F12)
// You should see:
π Checking jobs... Total: 1, Active: 1
π‘ Fetching latest status for video_xxx...
β
Auto-refresh complete4. Download Fails
Error: Invalid value: 'mp4'
Solution: Already fixed! Refresh your browser.
5. Gallery Loads Slowly
Expected: Thumbnails show in < 1 second
If slow: Check internet connection
Tip: Videos load in background, give it time
| Document | Description |
|---|---|
| START_HERE.md | Quick start guide |
| SETUP.md | Detailed setup instructions |
| openai-video-api-guide.md | Complete API reference |
| DIRECTORY_STRUCTURE.md | Folder organization guide |
| FIXES.md | Bug fixes changelog |
Contributions are welcome! Please feel free to submit a Pull Request.
How to contribute:
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Dark mode
- Video thumbnail generation
- Batch prompt upload (CSV)
- Video comparison view
- Custom resolution support
- Progress notifications (desktop)
- Video editing capabilities
- Collaborative projects
- Cloud storage integration
- Mobile app (React Native)
This project is licensed under the MIT License - see the LICENSE file for details.
- OpenAI - For the amazing Sora API
- Tailwind CSS - For beautiful styling
- Font Awesome - For awesome icons
- You! - For using Sora Studio
Issues?
- Open an issue on GitHub Issues
- Check Troubleshooting section
- Read the docs
Questions?
- Check OpenAI Documentation
- Visit OpenAI Community
Give a βοΈ if this project helped you!