What is Director's Desk?
Director's Desk is a single-file, self-contained production management tool built for filmmakers, directors, and creative teams. It runs entirely in your browser — no server, no account, no internet connection required after the file is downloaded.
Everything is stored locally in your browser's localStorage and can be exported or imported as a portable .json file. The entire application is one .html file — open it in any modern browser and start working immediately.
No dependencies. No build step. No cloud. Your production data lives on your machine and travels with you as a simple JSON file. Share it with your team by emailing the file.
Feature Summary
Dashboard
The Dashboard is the first tab you see on launch. It auto-aggregates data from all other modules and shows:
| Widget | What it shows |
|---|---|
| Stats Bar | Total count of scripts, scenes, team members, and equipment items |
| Latest Script | The most recently added script with its genre and status badge |
| Scene Progress | Scenes marked "Done" vs total, displayed as a progress bar |
| Team Availability | Count of available team members vs total |
| Equipment | Total items tracked and count of items with "Missing" status flagged in red |
The Dashboard updates automatically whenever you save any record. It is always in sync with your current data.
Scripts
The Scripts module is a lightweight screenplay drafting environment. Each script record contains:
| Field | Purpose |
|---|---|
| Title | Name of the script or episode |
| Status | Draft / In Review / Final — shown as a colour-coded badge |
| Version | Free-text version label, e.g. v1.0, v2-revision |
| Genre / Type | Drama, Short Film, Documentary, Commercial, etc. |
| Notes / Synopsis | Short summary or production notes |
| Script Content | Full free-text screenplay body with formatting toolbar |
Formatting Toolbar
Inside the script editor, five quick-insert buttons follow standard screenplay conventions:
Each script stores its full text body. A 120-character preview is shown in the list view. Open the edit form to see and edit the complete content.
Story & Scenes
Scene breakdown follows traditional production design practice. Each scene record maps to a single shootable unit:
| Field | Details |
|---|---|
| Scene Number | Production number (01, 02A, etc.) |
| INT / EXT | Interior, Exterior, or INT/EXT split |
| Location | Set name or address |
| Time of Day | DAY / NIGHT / DAWN / DUSK |
| Status | Planned / Shooting / Done — colour-coded in list |
| Characters | Comma-separated list of characters in the scene |
| Description | What happens — action, mood, key beats |
| Director's Notes | Private shot ideas, camera moves, emotional direction |
Status colours in the list: Planned grey · Shooting amber · Done green. The Dashboard progress bar reflects Done scenes automatically.
Team Resources
Each team member record stores contact and scheduling information:
| Field | Details |
|---|---|
| Name | Full name of the person |
| Role | Director, DP, Producer, Writer, Actor, Editor, Sound, Art, Other |
| Contact | Email address or phone number |
| Availability | Available / Partial / Unavailable — colour coded green / amber / red |
| Notes / Bio | Previous credits, special skills, scheduling constraints |
Use the Role filter dropdown to quickly view only one department (e.g. show all Sound crew).
Equipment
Track every piece of gear your production needs or owns:
| Field | Details |
|---|---|
| Name | Make and model (e.g. Sony FX3, Aputure 600D) |
| Category | Camera / Lens / Lighting / Sound / Grip / Post / Other |
| Status | Available ● · Rented ● · Missing ● |
| Owner / Source | Owned, rental house name, borrowed from crew, etc. |
| Notes | Serial number, rental dates, condition notes, specs |
The Dashboard flags missing items in red so nothing falls through the cracks on shoot day.
Drawboard
The Drawboard is a full canvas drawing environment for storyboards, shot diagrams, location sketches, and production notes. It supports multiple boards — one per scene, per reel, or however you organise your work.
Drawing Tools
| Icon | Tool | Behaviour |
|---|---|---|
| ✏️ | Pencil | Freehand strokes at 60% opacity — soft, textured feel ideal for rough sketches |
| 🖊️ | Pen | Smooth opaque strokes with a subtle glow — clean lines for final storyboard panels |
| ▭ | Rectangle | Drag to draw a rectangle — optional fill mode via checkbox |
| ○ | Circle / Ellipse | Drag to draw an ellipse fitted to bounding box — optional fill mode |
| 🧹 | Eraser | Pixel-level destination-out erase — enlarges to 2.5× brush size for efficient clearing |
| T | Text | Click canvas to open a floating text overlay, type multi-line text, confirm to stamp permanently |
Toolbar Controls
| Control | What it does |
|---|---|
| Colour Swatches | 6 preset production palette colours — click to activate |
| Custom Colour Picker | Full colour wheel via native browser colour input |
| Size Slider | 1–60px brush size; label updates live |
| Font Size | 8–120px font size for the Text tool only |
| Fill Toggle | Appears for Rect and Circle only — fills shape with 50% opacity colour |
| ↩ Undo | Steps back through up to 40 drawing actions per board session |
| ↪ Redo | Re-applies undone actions within the same session |
| 🗑 Clear | Wipes the entire current board after confirmation |
| ⬇ PNG | Exports the current board as a transparent-background PNG file |
Multi-Board Management
Create unlimited boards for a single production. Boards are listed as tabs at the top of the Drawboard toolbar.
+ Board button to add a blank canvas. The app switches to it automatically.Del Board to permanently remove the current board. Must have at least one board at all times.Getting Started
director-tool.html in any modern browser (Chrome, Firefox, Safari, Edge). No installation needed.localStorage immediately. Close the tab and reopen — your data is still there.⬇ Export in the top-right header to download a .json backup file. Date-stamped automatically..json file to a collaborator. They click ⬆ Import to load your full production data into their own browser.Clearing browser data or cookies may erase localStorage. Always keep a recent .json export as your backup. Treat it like a project file.
Writing a Script
Save Script. The script appears in the list with a preview of the first 120 characters.Edit on any script to update it. Change the status from Draft → In Review → Final as the script progresses through production.Using the Drawing Tools
Drawboard tab. The canvas fills the viewport automatically.Add or press Ctrl+Enter to stamp it permanently.Export & Import
The export/import system serialises your entire production database — all scripts, scenes, team members, equipment records, and Drawboard images — into a single portable JSON file.
Exporting
directors-desk-YYYY-MM-DD.json. Keep this file safe — it is your entire production archive.Importing
.json file.Each board's canvas image is stored as a base64 PNG data URL inside the JSON. This makes the export file larger when boards contain drawings, but keeps everything self-contained in one file.
Architecture
Director's Desk is a pure vanilla implementation. No build toolchain, no package manager, no external dependencies whatsoever. The entire application ships as a single .html file.
| Layer | Technology | Notes |
|---|---|---|
| Markup | HTML5 | Semantic structure, ARIA roles on interactive elements |
| Styling | CSS3 Custom Properties | Dark theme via :root variables; no preprocessor |
| Logic | Vanilla JavaScript (ES5-compatible) | No classes; procedural function style for maximum compatibility |
| Canvas | HTML5 Canvas 2D API | HiDPI (devicePixelRatio) aware; composite operations for eraser |
| Persistence | localStorage + JSON | Auto-save on every mutation; full export/import via Blob + FileReader |
| Fonts | Google Fonts (Bebas Neue, Courier Prime) | Loaded via @import; gracefully degrades offline |
Data Structure
The global state object is the single source of truth for all application data. It is serialised to JSON on every save and stored in localStorage under the key directorDesk.
// Global state object var state = { scripts: [ { id: "uid_string", title: "Script Title", status: "draft" | "review" | "final", version: "v1.0", genre: "Drama", notes: "Synopsis...", content: "FADE IN:\n\nINT. ..." } ], scenes: [ { id: "uid_string", number: "01", intExt: "INT" | "EXT" | "INT/EXT", location: "Warehouse", time: "DAY" | "NIGHT" | "DAWN" | "DUSK", status: "planned" | "shooting" | "done", chars: "JOHN, MARY", desc: "Scene description...", notes: "Director notes..." } ], team: [ { id: "uid_string", name: "Full Name", role: "DP", contact: "email@example.com", availability: "available" | "partial" | "unavailable", notes: "Bio / credits..." } ], equipment: [ { id: "uid_string", name: "Sony FX3", category: "Camera", status: "available" | "rented" | "missing", owner: "Owned", notes: "Serial: ABC123" } ], drawboards: [ { id: "uid_string", name: "Board 1", imageData: "data:image/png;base64,...", // stored on board switch or export strokes: [], // reserved for future vector export texts: [] // reserved } ] };
Canvas Engine
The Drawboard uses the HTML5 Canvas 2D API directly. Key implementation decisions:
HiDPI / Retina Support
The canvas is scaled by window.devicePixelRatio so drawings appear sharp on all screens. The logical drawing coordinates match CSS pixels; the physical canvas buffer is multiplied by DPR.
db.dpr = window.devicePixelRatio || 1; dbCanvas.width = w * db.dpr; dbCanvas.height = h * db.dpr; dbCtx.scale(db.dpr, db.dpr);
Touch Input
Touch events are mapped to the same pointer handlers as mouse events using a thin wrapper. touch-action: none on the canvas prevents the browser from intercepting scroll or zoom gestures during drawing.
function dbTouchStart(e) { e.preventDefault(); // block browser scroll/zoom var t = e.touches[0]; dbPointerDown({ clientX: t.clientX, clientY: t.clientY }); }
Shape Preview
Rectangles and ellipses show a live preview while dragging. Before the first pointer move, a full getImageData snapshot is taken. On each move, the snapshot is restored with putImageData before redrawing the shape at the new dimensions. On pointer-up, the final shape is committed.
Eraser
The eraser uses globalCompositeOperation = 'destination-out' to punch transparent holes into the canvas rather than painting white. This preserves transparency for clean PNG export.
Pencil vs Pen
Both tools use the same continuous path-drawing loop but differ in alpha and shadow:
| Property | Pencil | Pen |
|---|---|---|
| globalAlpha | 0.6 | 1.0 |
| shadowBlur | 0 | 1 |
| shadowColor | — | matches stroke colour |
Storage & Persistence
localStorage Key
All data is stored under a single key: directorDesk. The value is a JSON string of the complete state object.
Save Strategy
The save() function is called immediately after every mutation (form save, delete, board change). There is no debounce or batch — writes are synchronous and instant.
ID Generation
Every record gets a unique ID generated by combining timestamp base-36 encoding with 4 random alphanumeric characters:
function uid() { return Date.now().toString(36) + Math.random().toString(36).slice(2, 6); }
Drawboard Persistence
Canvas image data is not continuously serialised on every stroke (that would be too slow). Instead, dbSaveCurrentBoard() is called in three situations: when switching boards, when creating a new board, and when clicking Export. The canvas is serialised as a data:image/png;base64 string stored in state.drawboards[i].imageData.
If you close the Drawboard tab without exporting, any unsaved strokes since the last board switch are still in the canvas but not yet written to state. Switch boards or export before closing the tab to ensure full persistence.
Text Tool
Script Editor
Form Dialogs
All standard browser shortcuts work inside text areas — Ctrl+A select all, Ctrl+Z undo typing, Ctrl+C / Ctrl+V copy/paste — these are native browser functions, not overridden by the app.
Production Workflow
A recommended order for setting up a new production from scratch:
Drawboard Pro Tips
Use Pencil for thumbnails, Pen for finals. The Pencil's lower opacity is perfect for fast rough storyboard thumbnails. Once you like a composition, switch to Pen and re-draw on top for clean lines.
Combine shapes and freehand. Use Rect and Circle to block out camera frames and subject areas, then use Pen to draw characters and details inside them.
Label everything with Text. Add scene numbers, shot codes, and lens notes directly onto the storyboard panels using the Text tool. Set font size to 14–16px for small annotations, 24–32px for shot headers.
One board per shot list. If you have many scenes, consider naming boards by shoot day rather than scene — "Day 1 — INT. Office", "Day 2 — EXT. Street". This mirrors how you'll actually work on set.
Script Writing Tips
Use the version field deliberately. Start at v0.1 for rough outlines. Promote to v1.0 when the structure is locked. Increment by 0.1 for minor revisions and 1.0 for full redrafts after notes.
Keep synopsis and content separate. The Notes / Synopsis field is for your quick reference — the one-paragraph pitch. The Script Content field is for the full screenplay. Don't duplicate between them.
Sharing with Your Team
Export the JSON and send it to your AD, DP, or producer. They import it on their machine, and immediately have full access to the script, scene breakdown, and storyboards. They can add team members, update equipment status, and re-export. You import their version and the data merges on load.
The tool works fully offline once the HTML file is saved locally. Google Fonts will not load without internet but the layout degrades gracefully to Georgia serif. All functionality remains intact.