Everything Forge Studio is built on, what your browser needs to run it, and how to serve it locally.
Forge Studio is a zero-build, zero-framework web application. Every page is plain HTML, CSS and vanilla JavaScript running directly in the browser — there is no bundler, no package manager, no server-side code, and nothing is ever uploaded. The only third-party dependency is ffmpeg.wasm, vendored locally for offline MP4 export.
| Page | Role | Source |
|---|---|---|
| index.html | Dashboard / launcher | — |
| photo.html | GraphicForge — layer-based image & graphics editor | js/photo.js |
| video.html | MotionForge — multi-track video editor | js/video.js |
| word.html | DocForge — word processor (.docx / .doc) | js/word.js |
| sheet.html | SheetForge — spreadsheet (.xlsx / .xls / .csv) | js/sheet.js |
| pdf.html | PDFForge — PDF viewer & editor | js/pdf.js |
| docs.html | This page | — |
| Technology | Used for | Documentation |
|---|---|---|
| HTML5 / CSS3 | UI shell, panels, timeline layout. Custom properties for theming, Flexbox & Grid for layout — no CSS framework. | MDN: CSS |
| JavaScript (ES2020+) | All application logic, in two self-contained scripts. No framework, no transpiler, no build step. | MDN: JavaScript |
| Canvas 2D API | All rendering in both editors: layer compositing, blend modes, filters, gradients, text-on-path, video preview compositing, thumbnails. | MDN: CanvasRenderingContext2D |
| Pointer Events | Tools, transform handles, clip dragging, trimming, scrubbing — one input model for mouse, trackpad and pen. | MDN: Pointer events |
| Drag & Drop + File APIs | Dropping images onto the photo canvas, media import, bin-to-timeline drags, layer reordering; FileReader / Blob / object URLs for all file I/O. |
MDN: File API |
| HTMLMediaElement | Frame-accurate seek & playback of video/audio clips on the timeline. | MDN: HTMLMediaElement |
| MediaRecorder API | Recording the timeline to WebM on export, and webcam capture. | MDN: MediaRecorder |
| canvas.captureStream() | Turning the preview canvas into a live video stream for the export recorder. | MDN: captureStream |
| Web Audio API | Mixing every clip's audio into one stream during export (MediaElementAudioSourceNode → MediaStreamAudioDestinationNode). |
MDN: Web Audio API |
| getUserMedia / MediaDevices | Webcam & microphone capture, with device enumeration for the camera/mic pickers. | MDN: getUserMedia |
| ffmpeg.wasm 0.12 | WebM → MP4 transcode (H.264 + AAC) entirely in the browser via WebAssembly, running in a Web Worker. Vendored in vendor/ffmpeg/ (@ffmpeg/ffmpeg 0.12.10 + @ffmpeg/core 0.12.6, ~32 MB) so it works offline. |
ffmpeg.wasm docs · GitHub |
| mammoth.js 1.8 | Reading .docx files into clean HTML for DocForge. Vendored in vendor/mammoth/. |
mammoth.js on GitHub |
| JSZip 3.10 | Packaging DocForge's generated WordprocessingML into real .docx files (a .docx is a zip). Vendored in vendor/jszip/. |
JSZip docs |
| SheetJS (xlsx) 0.20 | Reading .xlsx / legacy .xls / .csv and writing .xlsx for SheetForge. Vendored in vendor/xlsx/. Formulas are evaluated by SheetForge's own engine. |
SheetJS docs |
| pdf.js 3.11 | Rendering PDF pages in PDFForge (Mozilla's PDF engine, runs in a worker). Vendored in vendor/pdfjs/. |
pdf.js docs |
| pdf-lib 1.17 | Writing PDFs: baking annotations into pages as vector content, page rotate/reorder/delete, merging documents, creating blank PDFs. Vendored in vendor/pdflib/. |
pdf-lib docs |
| Web Workers / WebAssembly | ffmpeg runs off the main thread in a module worker so the UI stays responsive during conversion. | MDN: Web Workers · MDN: WebAssembly |
MediaRecorder and canvas capture support differ, so video export and webcam recording may not work there.
Chrome / Edge: full support Safari: editors onlyfile://: webcam access requires a
secure context
(localhost counts), and the ffmpeg worker can't load from file:// URLs. Any static file server works.sw.js) precaches the entire suite —
including the 32 MB ffmpeg core — on your first visit, so pages keep loading even if the local server is
stopped. In Chrome/Edge you can also install Forge Studio from the address-bar install icon to get a
standalone app window with its own dock icon.
MDN: Progressive Web AppsEasiest: double-click Forge Studio.command in the project folder — it starts the
server and opens the app. Or run any static server yourself:
# Python (preinstalled on macOS)
python3 -m http.server 8642
# then open http://localhost:8642
# or Node, if you prefer
npx serve .
Editors/
├── index.html ← dashboard
├── photo.html ← GraphicForge (image & graphics editor)
├── video.html ← MotionForge (video editor)
├── docs.html ← this page
├── css/
│ ├── base.css ← shared theme & controls
│ ├── photo.css
│ └── video.css
├── js/
│ ├── photo.js ← photo editor engine (layers, tools, history, I/O)
│ └── video.js ← video editor engine (timeline, playback, export, webcam)
└── vendor/ffmpeg/ ← ffmpeg.wasm (offline MP4 export)
Professional sample files ship in samples/ — every one was generated by the
editors' own engines, so they double as proof that the file formats are genuine:
| File | Shows off | Try it |
|---|---|---|
| business-proposal.docx | DocForge: headings, lists, a table, colors and an embedded chart image | Open in DocForge |
| letter-template.docx + customers.csv | Mail merge: «Name» «Company» «Amount» placeholders plus a matching CSV — open the letter, hit ⧉ Mail Merge, load the CSV | Open in DocForge · CSV |
| sales-report.xlsx | SheetForge: two sheets, live SUM/AVERAGE/MAX/COUNTIF formulas and a VLOOKUP demo — select data and hit 📊 Chart | Open in SheetForge |
| company-report.pdf | PDFForge: branded two-page report with a chart and a fillable sign-off form (text fields + checkbox) | Open in PDFForge |
| demo-project.forge.json | GraphicForge: five-layer project — photo, gradient title, curved text, star badge (use Open… in GraphicForge) | Download project |
| demo-clip.webm + demo-audio.wav | MotionForge: 6-second motion-graphics clip (made by the suite itself) and a synth soundtrack — use ✨ Load demo media in the bin | Open MotionForge |
| barcode & photo samples | Five generated test images for background removal, clone stamp and filters — GraphicForge's Samples… menu | Open GraphicForge |
Every editor can be embedded in another website with an <iframe>, and each supports
URL parameters that control chrome and behavior:
?view=1 — read-only: editing toolbars and panels are hidden, interactions disabled (viewer mode)?embed=1 — hides the app bar for a clean embedded look (combine with view for a pure viewer)?src=URL — auto-opens a file on load (same-origin, or CORS-accessible). Works on DocForge, SheetForge and PDFForge.<!-- read-only spreadsheet viewer embedded in your site -->
<iframe src="https://your-host/sheet.html?embed=1&view=1&src=reports/q4.xlsx"
style="width:100%;height:600px;border:0"></iframe>
<!-- editable document editor -->
<iframe id="doc" src="https://your-host/word.html?embed=1"></iframe>
For programmatic control, DocForge, SheetForge and PDFForge speak a small
postMessage API.
The editor announces itself with {type:'forge:ready'}; then:
const frame = document.getElementById('doc').contentWindow;
// load a document (binary formats are base64; html/csv/txt are plain strings)
frame.postMessage({ type: 'forge:load', format: 'docx', name: 'letter.docx', data: base64 }, '*');
// ask for the current document back
frame.postMessage({ type: 'forge:export' }, '*');
window.addEventListener('message', e => {
if (e.data.type === 'forge:document') {
// e.data = { format: 'docx'|'xlsx'|'pdf', name, data: base64 }
}
});
Formats: DocForge loads docx / html / txt and exports docx;
SheetForge loads xlsx / csv and exports xlsx;
PDFForge loads and exports pdf.
When self-hosting behind a real web server, make sure it doesn't send an
X-Frame-Options header that blocks framing.
Forge Studio's own code has no external runtime dependencies.
ffmpeg.wasm is free software:
the JavaScript wrapper is MIT-licensed, and the bundled FFmpeg core is
LGPL/GPL (it includes the GPL x264 encoder).
Using it as shipped is free for any use; if you redistribute this app commercially, keep the ffmpeg core as a
separate, replaceable file (as it is now in vendor/ffmpeg/) and preserve its license notices.