/ Documentation ← Back to dashboard

Tech Stack & Requirements

Everything Forge Studio is built on, what your browser needs to run it, and how to serve it locally.

Overview

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.

PageRoleSource
index.htmlDashboard / launcher
photo.htmlGraphicForge — layer-based image & graphics editorjs/photo.js
video.htmlMotionForge — multi-track video editorjs/video.js
word.htmlDocForge — word processor (.docx / .doc)js/word.js
sheet.htmlSheetForge — spreadsheet (.xlsx / .xls / .csv)js/sheet.js
pdf.htmlPDFForge — PDF viewer & editorjs/pdf.js
docs.htmlThis page

Core technologies

TechnologyUsed forDocumentation
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 (MediaElementAudioSourceNodeMediaStreamAudioDestinationNode). 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

Requirements

Running locally

Easiest: 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 .

Project layout

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)

Demo documents

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:

FileShows offTry 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

Embedding & read-only mode

Live example: open embed-demo.html — a mock "company intranet" page with three working embeds (read-only spreadsheet, host-controlled document editor with the postMessage API, and a PDF viewer). View its source to copy the patterns.

Every editor can be embedded in another website with an <iframe>, and each supports URL parameters that control chrome and behavior:

<!-- 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.

Licensing notes

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.

Good to know: video export runs in real time (a 30-second timeline takes ~30 seconds to record, plus roughly the same again for MP4 conversion), and the tab should stay visible during the recording pass — browsers throttle hidden tabs.