Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions apps/openscene/app/globals.css

Large diffs are not rendered by default.

43 changes: 35 additions & 8 deletions apps/openscene/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { ExternalLink, SkipLink } from "@theorvane/ui";

import { assetsFor, downloadUrl, releaseNotesUrl, releasesUrl, releaseTag, releaseVersion } from "../lib/releases";

const siteUrl = "https://openscene.app/";
const repositoryUrl = "https://github.com/Theorvane/openscene";
const releasesUrl = "https://github.com/Theorvane/openscene/releases";
const readmeUrl = "https://github.com/Theorvane/openscene#readme";
const theorvaneUrl = "https://theorvane.tech/";
const modelsDevUrl = "https://models.dev";
Expand Down Expand Up @@ -34,37 +35,63 @@ const faq = [
["Which providers can I use?", "Anything in the generated models.dev catalog that speaks the OpenAI or Anthropic wire format, plus Google Gemini natively. For OpenAI you can use an API key or a ChatGPT sign-in."],
["Where does my footage go?", "Into the project folder you chose, and nowhere else. A provider only ever receives what you ask the agent to send it."],
["Do I need FFmpeg?", "Yes, for export. OpenScene drives the FFmpeg on your machine rather than bundling its own, and refuses to start an export it cannot complete."],
["Is there an installer?", "Not yet. OpenScene runs from source today; there is no packaged build or auto-update, and this site will say so until there is."],
["Is there an installer?", `Yes, from ${releaseVersion}. macOS, Windows, and Linux builds are published on every release, and running from source stays supported. The macOS builds are signed with a Developer ID certificate and notarized; the Windows and Linux builds are unsigned, so Windows SmartScreen warns on first run.`],
["How do updates reach me?", "The application checks for a published release and asks before it updates. Nothing is downloaded or replaced without your answer, and a build you run from source updates when you pull and rebuild."],
] as const;

/** Platform order follows the desktop share the project sees, not alphabetical order. */
const downloads = [
{ platform: "macos" as const, label: "macOS", note: "Signed and notarized" },
{ platform: "windows" as const, label: "Windows", note: "Unsigned — SmartScreen warns on first run" },
{ platform: "linux" as const, label: "Linux", note: "Unsigned, as AppImage and deb normally are" },
];

const schema = {
"@context": "https://schema.org",
"@graph": [
{ "@type": "SoftwareApplication", "@id": `${siteUrl}#application`, name: "OpenScene", url: siteUrl, applicationCategory: "VideoApplication", operatingSystem: "macOS, Windows, Linux", description: "A local-first desktop video editor with an AI agent that operates the timeline, plus voice and video generation and local FFmpeg export.", isAccessibleForFree: true, license: "https://opensource.org/licenses/MIT", codeRepository: repositoryUrl, softwareRequirements: "Node.js 22 or newer; FFmpeg on the host machine for export", offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, author: { "@id": "https://theorvane.tech/#organization" } },
{ "@type": "SoftwareApplication", "@id": `${siteUrl}#application`, name: "OpenScene", url: siteUrl, applicationCategory: "VideoApplication", operatingSystem: "macOS, Windows, Linux", description: "A local-first desktop video editor with an AI agent that operates the timeline, plus voice and video generation and local FFmpeg export.", isAccessibleForFree: true, license: "https://opensource.org/licenses/MIT", codeRepository: repositoryUrl, softwareVersion: releaseVersion, downloadUrl: `${siteUrl}#download`, softwareRequirements: "FFmpeg on the host machine for export; Node.js 22 or newer to run from source", offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, author: { "@id": "https://theorvane.tech/#organization" } },
{ "@type": "WebSite", "@id": `${siteUrl}#website`, name: "OpenScene", url: siteUrl, inLanguage: "en", publisher: { "@id": "https://theorvane.tech/#organization" } },
{ "@type": "FAQPage", "@id": `${siteUrl}#faq`, mainEntity: faq.map(([question, answer]) => ({ "@type": "Question", name: question, acceptedAnswer: { "@type": "Answer", text: answer } })) },
],
};

export default function HomePage() {
return <><SkipLink /><script data-testid="openscene-schema" type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }} />
<header className="shell"><a className="wordmark" href="#top"><img className="wordmark__mark" src="/logo.svg" alt="" width="24" height="24" />OPEN<span>SCENE</span></a><nav aria-label="Primary"><a href="#capabilities">Capabilities</a><a href="#agent">Agent</a><a href="#providers">Providers</a><a href="/docs">Docs</a><a href="#faq">FAQ</a><ExternalLink href={repositoryUrl}>GitHub ↗</ExternalLink></nav></header>
<header className="shell"><a className="wordmark" href="#top"><img className="wordmark__mark" src="/logo.svg" alt="" width="24" height="24" />OPEN<span>SCENE</span></a><nav aria-label="Primary"><a href="#download">Download</a><a href="#capabilities">Capabilities</a><a href="#agent">Agent</a><a href="#providers">Providers</a><a href="/docs">Docs</a><a href="#faq">FAQ</a><ExternalLink href={repositoryUrl}>GitHub ↗</ExternalLink></nav></header>

<main className="product-surface product-surface--openvideo" data-testid="openvideo-workspace-surface" id="main-content">
<main className="product-surface product-surface--openscene" data-testid="openscene-workspace-surface" id="main-content">
<section className="hero shell" id="top">
<div>
<p className="eyebrow">Open source · MIT · Local-first</p>
<h1>The video editor<br /><em>that edits with you.</em></h1>
<p className="lede">OpenScene is a desktop editor with an agent at the controls. It reads your timeline, cuts clips, generates voice and video, and exports through your own FFmpeg. Your media stays on your machine, and you decide which model providers it may talk to — including none.</p>
<div className="actions"><ExternalLink className="button primary" href={repositoryUrl}>View source on GitHub ↗</ExternalLink><a className="button" href="/docs">Read the docs</a></div>
<div className="actions"><a className="button primary" href="#download">Download for desktop</a><ExternalLink className="button" href={repositoryUrl}>View source on GitHub ↗</ExternalLink><a className="button" href="/docs">Read the docs</a></div>
</div>
<section className="terminal" aria-label="Run OpenScene from source">
<p>RUN FROM SOURCE</p>
<ol data-testid="run-from-source">{runFromSource.map((line) => <li key={line}><code>{line}</code></li>)}</ol>
<span>Node 22+ · FFmpeg for export · no installer yet</span>
<span>Node 22+ · FFmpeg for export · or download a build below</span>
</section>
</section>

<section className="downloads shell" id="download" aria-label="Download OpenScene">
<p className="eyebrow">Download · {releaseTag}</p>
<h2>Every desktop,<br /><em>one release.</em></h2>
<p className="note">Packaged builds for all three platforms, published from the same tag. FFmpeg is still yours to install — OpenScene drives the one on your machine rather than bundling its own.</p>
<div className="download-grid" data-testid="download-grid">
{downloads.map(({ platform, label, note }) => (
<article key={platform}>
<h3>{label}</h3>
<ul>{assetsFor(platform).map((asset) => (
<li key={asset.file}><ExternalLink className="button" href={downloadUrl(asset)}>Download for {label} · {asset.variant}</ExternalLink></li>
))}</ul>
<p>{note}</p>
</article>
))}
</div>
<p className="note"><ExternalLink href={releaseNotesUrl}>Release notes for {releaseTag} ↗</ExternalLink> · <ExternalLink href={releasesUrl}>All releases ↗</ExternalLink></p>
</section>

<section className="evidence-panel shell" aria-label="Agent approval request"><div><p className="eyebrow">Agent approval request</p><h2>Edit locally.<br /><em>Direct the work.</em></h2><p>A write action asks for consent; read-only timeline inspection remains immediate.</p></div><aside><img src="/logo.svg" alt="OpenScene" width="64" height="64" /><dl><div><dt>Request</dt><dd>Trim opening clip to 00:00:12.4</dd></div><div><dt>Impact</dt><dd>3.6 seconds of room tone</dd></div><div><dt>Status</dt><dd>Awaiting your approval</dd></div></dl></aside></section>
<section className="features shell" id="capabilities" aria-label="OpenScene capabilities">
{capabilities.map(([number, verb, title, description]) => <article key={verb}><b>{number}</b><h2><span>{verb}</span> {title}</h2><p>{description}</p></article>)}
Expand Down Expand Up @@ -106,6 +133,6 @@ export default function HomePage() {
</section>
</main>

<footer className="site-footer"><div className="shell footer-grid"><div className="footer-brand"><a className="wordmark" href="#top"><img className="wordmark__mark" src="/logo.svg" alt="" width="24" height="24" />OPEN<span>SCENE</span></a><p>A local-first desktop video editor with an agent that can drive it.</p></div><nav aria-label="OpenScene footer" className="footer-nav"><div><strong>Explore</strong><a href="#capabilities">Capabilities</a><a href="#agent">Agent</a><a href="#providers">Providers</a><a href="#faq">FAQ</a></div><div><strong>Documentation</strong><a href="/docs">Documentation</a><a href="/docs/ko" hrefLang="ko">한국어 문서</a><a href="/docs/install">Install and run</a><ExternalLink href={readmeUrl}>README ↗</ExternalLink></div><div><strong>Project</strong><ExternalLink href={repositoryUrl}>Repository ↗</ExternalLink><ExternalLink href={releasesUrl}>Releases ↗</ExternalLink></div><div><strong>Company</strong><ExternalLink href={theorvaneUrl}>Theorvane ↗</ExternalLink></div></nav></div><div className="shell footer-legal"><span>© 2026 Theorvane. OpenScene is open source under the MIT License.</span><span>Local by design.</span></div></footer>
<footer className="site-footer"><div className="shell footer-grid"><div className="footer-brand"><a className="wordmark" href="#top"><img className="wordmark__mark" src="/logo.svg" alt="" width="24" height="24" />OPEN<span>SCENE</span></a><p>A local-first desktop video editor with an agent that can drive it.</p></div><nav aria-label="OpenScene footer" className="footer-nav"><div><strong>Explore</strong><a href="#download">Download</a><a href="#capabilities">Capabilities</a><a href="#agent">Agent</a><a href="#providers">Providers</a><a href="#faq">FAQ</a></div><div><strong>Documentation</strong><a href="/docs">Documentation</a><a href="/docs/ko" hrefLang="ko">한국어 문서</a><a href="/docs/install">Install and run</a><ExternalLink href={readmeUrl}>README ↗</ExternalLink></div><div><strong>Project</strong><ExternalLink href={repositoryUrl}>Repository ↗</ExternalLink><ExternalLink href={releasesUrl}>Releases ↗</ExternalLink></div><div><strong>Company</strong><ExternalLink href={theorvaneUrl}>Theorvane ↗</ExternalLink></div></nav></div><div className="shell footer-legal"><span>© 2026 Theorvane. OpenScene is open source under the MIT License.</span><span>Local by design.</span></div></footer>
</>;
}
24 changes: 16 additions & 8 deletions apps/openscene/lib/docs/content.en.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { downloadUrl, releaseAssets, releaseTag } from "../releases";
import type { Platform } from "../releases";
import type { DocPage, LocaleStrings } from "./types";

const platformLabels: Record<Platform, string> = { macos: "macOS", windows: "Windows", linux: "Linux" };

export const enStrings: LocaleStrings = {
indexTitle: "OpenScene documentation",
indexSummary: "Install OpenScene from source, learn the workspace and timeline, put the Edit Agent to work, and connect only the model providers you want.",
indexLede: "OpenScene runs from source today — there is no packaged installer yet. Everything documented here is behaviour this build actually has; planned work is called out as not yet available.",
indexSummary: "Download OpenScene or run it from source, learn the workspace and timeline, put the Edit Agent to work, and connect only the model providers you want.",
indexLede: "OpenScene ships packaged builds for macOS, Windows, and Linux, and still runs from source. Everything documented here is behaviour this build actually has; planned work is called out as not yet available.",
sidebarLabel: "Documentation",
onThisPage: "On this page",
previous: "Previous",
Expand All @@ -19,7 +23,7 @@ const overview: DocPage = {
blocks: [
{ kind: "paragraph", text: "OpenScene is an open-source Electron application for editing video on your own machine. You open a folder as a project, put clips on a timeline, and export an H.264/AAC MP4 through the FFmpeg already installed on your system." },
{ kind: "paragraph", text: "What separates it from a conventional editor is the **Edit Agent**: a chat panel docked beside the timeline that calls the same operations the interface does. It can read your timeline, place and trim clips, generate voice or video, and start an export — and it asks for approval before anything that writes to your project." },
{ kind: "note", tone: "caution", text: "OpenScene is pre-release. It runs from source; there is no packaged installer and no auto-update. See [Install and run](/docs/install)." },
{ kind: "note", tone: "caution", text: "OpenScene is pre-release. Packaged builds are published for macOS, Windows, and Linux, and it still runs from source. See [Install and run](/docs/install)." },
{ kind: "heading", text: "What you get" },
{ kind: "list", items: [
"A real timeline — video and audio tracks, trim, split, move, duplicate, keyframes, transitions, per-track mix, undo and redo",
Expand All @@ -33,7 +37,7 @@ const overview: DocPage = {
{ kind: "heading", text: "Current boundaries" },
{ kind: "table", head: ["Works today", "Not yet"], rows: [
["Selected-window capture to local WebM", "Full-screen capture; microphone or system-audio mix in the recorder"],
["Local projects, media, timeline editing, undo and redo", "Cloud sync, hosted rendering, accounts, auto-update"],
["Local projects, media, timeline editing, undo and redo", "Cloud sync, hosted rendering, accounts"],
["Local H.264/AAC MP4 export", "Other export formats; frame-perfect multitrack mastering guarantees"],
["Agent-driven editing, generation, and export", "Unattended operation — writes always ask for approval"],
["Google Veo image-to-video via a reference image", "Sora reference images, which need a multipart upload path this build does not send"],
Expand All @@ -51,9 +55,13 @@ const overview: DocPage = {

const install: DocPage = {
title: "Install and run",
summary: "Prerequisites, cloning the repository, pointing OpenScene at your FFmpeg, and verifying the build from source.",
summary: "Downloading a packaged build, or cloning the repository, pointing OpenScene at your FFmpeg, and verifying the build from source.",
blocks: [
{ kind: "note", tone: "caution", text: "There is no packaged installer or auto-update yet. OpenScene runs from source, and this page will say otherwise only when that changes." },
{ kind: "heading", text: "Download a packaged build" },
{ kind: "paragraph", text: `Packaged builds are published for macOS, Windows, and Linux on every release. ${releaseTag} is current:` },
{ kind: "table", head: ["Platform", "Build", "File"], rows: releaseAssets.map((asset) => [platformLabels[asset.platform], asset.variant, `[${asset.file}](${downloadUrl(asset)})`]) },
{ kind: "note", tone: "info", text: "The macOS builds are signed with a Developer ID certificate and notarized by Apple, so they open normally. The Windows builds are unsigned: SmartScreen warns on first run, and **More info → Run anyway** starts them. The Linux builds are unsigned, which is normal for AppImage and deb." },
{ kind: "paragraph", text: `Every platform still needs FFmpeg for export — see [Pointing at your FFmpeg](#pointing-at-your-ffmpeg) below. The rest of this page covers running from source, which stays supported alongside the packaged builds.` },
{ kind: "heading", text: "Prerequisites" },
{ kind: "list", items: [
"Node.js 22 or newer and npm 10 or newer",
Expand All @@ -73,7 +81,7 @@ const install: DocPage = {
{ kind: "paragraph", text: "Then choose the local model in the chat panel's model picker. Note that watching footage needs a vision-capable model — see [Providers and models](/docs/providers)." },
{ kind: "heading", text: "Verify from source" },
{ kind: "code", language: "bash", lines: ["npm run typecheck", "npm test", "npm run build"] },
{ kind: "paragraph", text: "`npm run build` compiles the main, preload, and renderer bundles into `out/`. It does not package an installer. Some behaviour can only be checked by hand: operating-system permissions, real provider calls, and final render quality." },
{ kind: "paragraph", text: "`npm run build` compiles the main, preload, and renderer bundles into `out/`. It does not package an installer — the published builds come from the release pipeline. Some behaviour can only be checked by hand: operating-system permissions, real provider calls, and final render quality." },
],
};

Expand Down Expand Up @@ -322,7 +330,7 @@ const settings: DocPage = {
{ kind: "heading", text: "Local tool readiness" },
{ kind: "paragraph", text: "**Local Tools** reports whether the local runtime pieces export depends on are actually present, so a missing FFmpeg surfaces here instead of at the end of a render. Configure the path with `VIDEO_TOOL_FFMPEG_PATH` — see [Install and run](/docs/install)." },
{ kind: "heading", text: "Updates" },
{ kind: "note", tone: "caution", text: "There is no auto-update. **Updates** shows the installed version and explains that new releases reach this build by pulling the repository and rebuilding." },
{ kind: "note", tone: "info", text: "**Updates** shows the installed version. A packaged build checks for a published release and asks before it updates — nothing is downloaded or replaced without your answer. A build you run from source updates when you pull the repository and rebuild." },
],
};

Expand Down
Loading
Loading