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
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Task brief: OpenVideo product site
# Task brief: OpenScene product site

**Issue:** #24
**Branch:** `feat/24-openvideo-product-site`
**Canonical host:** `https://open-video.app`
**Branch:** `feat/24-openscene-product-site`
**Canonical host:** `https://openscene.app`

## Deliverable

A separate, static, independently deployable Next.js product site under `apps/openvideo/`, plus documentation and workspace integration. It must present OpenVideo as a local-first Electron recording and editing studio and point visitors to the official source and releases pages.
A separate, static, independently deployable Next.js product site under `apps/openscene/`, plus documentation and workspace integration. It must present OpenScene as a local-first Electron recording and editing studio and point visitors to the official source and releases pages.

## Required public facts

Expand All @@ -17,8 +17,8 @@ A separate, static, independently deployable Next.js product site under `apps/op

## Required external destinations

- Source: `https://github.com/Theorvane/openvideo`
- Releases: `https://github.com/Theorvane/openvideo/releases`
- Source: `https://github.com/Theorvane/openscene`
- Releases: `https://github.com/Theorvane/openscene/releases`
- Studio: `https://theorvane.tech/`

## Quality gates
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Task brief: OpenVideo hybrid AI editor product direction
# Task brief: OpenScene hybrid AI editor product direction

**Issue:** #40
**Branch:** `docs/40-openvideo-hybrid-ai-direction`
**Branch:** `docs/40-openscene-hybrid-ai-direction`

## Outcome

Record the approved OpenVideo direction: a hybrid AI video editor built on a local-first editing workflow, with optional local models or explicitly selected external AI services.
Record the approved OpenScene direction: a hybrid AI video editor built on a local-first editing workflow, with optional local models or explicitly selected external AI services.

## Scope

Expand Down
4 changes: 2 additions & 2 deletions .agents/task-briefs/52-rybbit-tracking-scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@

Add the approved RybbIt tracking script to the document head of each independently deployed Next.js application. Each app must carry its own immutable site ID:

- OpenVideo: `765035acbe87`
- OpenScene: `c2c0972a916f` (superseded `765035acbe87` when the site moved to `openscene.app`, which is a distinct RybbIt site)
- TypeMCP: `c37c7591084c`
- Theorvane: `13051a0ca43f`

All scripts load from `https://rybbit.handgarden.kr/api/script.js` with deferred loading.

## Non-goals

- Do not modify the OpenVideo desktop application.
- Do not modify the OpenScene desktop application.
- Do not introduce another provider, consent UI, cookies, runtime configuration, or deployment configuration.

## Quality gates
Expand Down
4 changes: 2 additions & 2 deletions .agents/task-briefs/72-four-site-landing-refresh.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@

## Approved scope

Refresh the public landing pages in `apps/theorvane`, `apps/type-mcp`, `apps/type-chain`, and `apps/openvideo`. They share a conversion and accessibility rhythm, but each keeps its own color, typography, product copy, and truthful runtime boundary.
Refresh the public landing pages in `apps/theorvane`, `apps/type-mcp`, `apps/type-chain`, and `apps/openscene`. They share a conversion and accessibility rhythm, but each keeps its own color, typography, product copy, and truthful runtime boundary.

## Required evidence

Use focused RED/GREEN tests for the affected page contracts and responsive CSS contracts. Before the implementation PR, run `npm test`, `npm run lint`, `npm run typecheck`, `npm run build`, `npm audit --omit=dev --audit-level=high`, and `git diff --check`. Inspect production builds at desktop and a 375px CSS viewport. The final PR must receive independent `sjungwon03-ai` review on its latest head.

## Prohibited claims

Do not introduce fabricated social proof. Preserve the published TypeMCP and TypeChain package boundaries. Present OpenVideo AI functions only as planned if mentioned; do not describe them as released.
Do not introduce fabricated social proof. Preserve the published TypeMCP and TypeChain package boundaries. Present OpenScene AI functions only as planned if mentioned; do not describe them as released.
2 changes: 1 addition & 1 deletion .agents/task-briefs/82-four-site-scroll-world-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
## Guardrails

- Do not generate assets, spend credits, purchase services, modify secrets, deploy, or change application product boundaries until the spec and production plan receive explicit review/approval.
- Keep TypeMCP, TypeChain, and OpenVideo claims within their published capability boundaries.
- Keep TypeMCP, TypeChain, and OpenScene claims within their published capability boundaries.
- Preserve semantic content, reduced-motion, media-failure, keyboard, and low-bandwidth fallbacks.

## Design artifact
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ This documentation task creates an executable plan only. It does not create an i
- Verify TDD order and commands are exact for every code task.
- Verify distinct native 16:9/9:16 media and actual-frame connector requirements remain mandatory.
- Verify the cost gate needs explicit active-conversation approval for both calibration and the full production batch.
- Verify all TypeMCP, TypeChain, and OpenVideo boundaries remain consumer/local-owned as defined in the merged design.
- Verify all TypeMCP, TypeChain, and OpenScene boundaries remain consumer/local-owned as defined in the merged design.
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This repository delivers four independently deployable public Next.js applicatio
- `apps/theorvane/`: the Theorvane brand site, canonical at `https://theorvane.tech`
- `apps/type-mcp/`: the TypeMCP product site, canonical at `https://typemcp.theorvane.tech`
- `apps/type-chain/`: the TypeChain product site, canonical at `https://typechain.theorvane.tech`
- `apps/openvideo/`: the OpenVideo local-first product site, canonical at `https://open-video.app`, with bilingual usage documentation at `/docs` (English) and `/docs/ko` (Korean)
- `apps/openscene/`: the OpenScene local-first product site, canonical at `https://openscene.app`, with bilingual usage documentation at `/docs` (English) and `/docs/ko` (Korean)
- `packages/`: neutral shared UI and design tokens only
- `docs/`: approved product and design specifications
- `.agents/`: tracked task briefs and agent operating aids; never imported by application runtime code
Expand Down Expand Up @@ -66,7 +66,7 @@ Keep labels focused; do not add unrelated labels merely for coverage.

- Pin GitHub Actions to immutable full commit SHAs.
- Do not put tokens, credentials, or secrets in repository files, logs, commits, or task briefs.
- Preserve canonical host behavior: `www.theorvane.tech` redirects permanently to `theorvane.tech`, and `openvideo.theorvane.tech` redirects permanently to `open-video.app`. The former OpenVideo subdomain must stay attached to its Vercel project for that redirect to be reached.
- Preserve canonical host behavior: `www.theorvane.tech` redirects permanently to `theorvane.tech`, and `openvideo.theorvane.tech`, `open-video.app`, and `www.open-video.app` each redirect permanently to `openscene.app`. Every former OpenScene hostname must stay attached to its Vercel project for those redirects to be reached.
- Keep website claims aligned with the published TypeMCP capability boundary.
- Generated output such as `.next/`, `dist/`, coverage, logs, and `node_modules/` must not be committed.

Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
# Theorvane website

A Next.js monorepo containing independently deployable public websites for **Theorvane**, **TypeMCP**, **TypeChain**, and **OpenVideo**.
A Next.js monorepo containing independently deployable public websites for **Theorvane**, **TypeMCP**, **TypeChain**, and **OpenScene**.

## Apps

- `apps/theorvane` — the Theorvane brand homepage at `https://theorvane.tech`
- `apps/type-mcp` — the TypeMCP product site and technical documentation at `https://typemcp.theorvane.tech`
- `apps/type-chain` — the TypeChain product site and technical documentation at `https://typechain.theorvane.tech`
- `apps/openvideo` — the OpenVideo local-first hybrid AI video-editor product site at `https://open-video.app`; current AI capabilities remain explicitly availability-scoped in the approved product direction
- `apps/openscene` — the OpenScene local-first hybrid AI video-editor product site at `https://openscene.app`; current AI capabilities remain explicitly availability-scoped in the approved product direction

## OpenVideo documentation
## OpenScene documentation

The OpenVideo usage documentation is published at `https://open-video.app/docs` in English and `https://open-video.app/docs/ko` in Korean. Unlike the TypeMCP portal it is authored in this repository as typed content blocks under `apps/openvideo/lib/docs/`, because it documents how to use the desktop application rather than mirroring approved documents from a source repository.
The OpenScene usage documentation is published at `https://openscene.app/docs` in English and `https://openscene.app/docs/ko` in Korean. Unlike the TypeMCP portal it is authored in this repository as typed content blocks under `apps/openscene/lib/docs/`, because it documents how to use the desktop application rather than mirroring approved documents from a source repository.

- `content.en.ts` and `content.ko.ts` hold one entry per page; both must cover every slug in the outline or `validateContent()` fails the build.
- `manifest.ts` owns the outline, reading order, and locale-aware paths. English is served unprefixed; other locales sit under their own segment.
- Screenshots live in `apps/openvideo/public/docs/` and are declared with fixed dimensions in `lib/docs/types.ts` so the browser reserves layout before they load.
- Screenshots live in `apps/openscene/public/docs/` and are declared with fixed dimensions in `lib/docs/types.ts` so the browser reserves layout before they load.
- Every page publishes a canonical URL, `hreflang` alternates for both locales, and `TechArticle` plus `BreadcrumbList` JSON-LD. The sitemap lists each localized route with its alternates.

Claims in this documentation must match OpenVideo's actual build. Pre-release limits — no packaged installer, no auto-update, Sora reference images unsupported — are stated rather than omitted.
Claims in this documentation must match OpenScene's actual build. Pre-release limits — no packaged installer, no auto-update, Sora reference images unsupported — are stated rather than omitted.

## TypeMCP documentation

Expand Down Expand Up @@ -51,4 +51,4 @@ npm test
npm run build
```

See [`docs/superpowers/specs/2026-07-22-theorvane-and-type-mcp-websites-design.md`](docs/superpowers/specs/2026-07-22-theorvane-and-type-mcp-websites-design.md), [`docs/superpowers/specs/2026-07-22-typemcp-documentation-portal-design.md`](docs/superpowers/specs/2026-07-22-typemcp-documentation-portal-design.md), and [`docs/superpowers/specs/2026-07-23-openvideo-product-site-design.md`](docs/superpowers/specs/2026-07-23-openvideo-product-site-design.md) for the approved scope.
See [`docs/superpowers/specs/2026-07-22-theorvane-and-type-mcp-websites-design.md`](docs/superpowers/specs/2026-07-22-theorvane-and-type-mcp-websites-design.md), [`docs/superpowers/specs/2026-07-22-typemcp-documentation-portal-design.md`](docs/superpowers/specs/2026-07-22-typemcp-documentation-portal-design.md), and [`docs/superpowers/specs/2026-07-23-openscene-product-site-design.md`](docs/superpowers/specs/2026-07-23-openscene-product-site-design.md) for the approved scope.
File renamed without changes
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { docGroups, docHref, docRoutes, docSlugs, findPage, isLocale, strings }
import { defaultLocale, type Locale, locales } from "../../../lib/docs/types";
import "../docs.css";

const siteUrl = "https://open-video.app";
const siteUrl = "https://openscene.app";

type RouteParams = { readonly slug?: string[] };

Expand Down Expand Up @@ -45,7 +45,7 @@ export async function generateMetadata({ params }: { params: Promise<RouteParams
canonical: path,
languages: { ...Object.fromEntries(locales.map((candidate) => [candidate, docHref(candidate, slug)])), "x-default": docHref(defaultLocale, slug) },
},
openGraph: { type: "article", url: `${siteUrl}${path}`, title, description, siteName: "OpenVideo", locale: locale === "ko" ? "ko_KR" : "en_US" },
openGraph: { type: "article", url: `${siteUrl}${path}`, title, description, siteName: "OpenScene", locale: locale === "ko" ? "ko_KR" : "en_US" },
twitter: { card: "summary_large_image", title, description },
};
}
Expand All @@ -55,7 +55,7 @@ function schemaFor(locale: Locale, slug?: string | undefined) {
const page = slug ? findPage(locale, slug) : undefined;
const url = `${siteUrl}${docHref(locale, slug)}`;
const crumbs = [
{ "@type": "ListItem", position: 1, name: "OpenVideo", item: `${siteUrl}/` },
{ "@type": "ListItem", position: 1, name: "OpenScene", item: `${siteUrl}/` },
{ "@type": "ListItem", position: 2, name: text.indexTitle, item: `${siteUrl}${docHref(locale)}` },
...(page ? [{ "@type": "ListItem", position: 3, name: page.title, item: url }] : []),
];
Expand Down Expand Up @@ -119,7 +119,7 @@ export default async function DocsPage({ params }: { params: Promise<RouteParams

return (
<DocShell locale={locale} slug={slug}>
<script data-testid="openvideo-docs-schema" type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaFor(locale, slug)) }} />
<script data-testid="openscene-docs-schema" type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaFor(locale, slug)) }} />
{page ? (
<article className="doc-article">
<h1>{page.title}</h1>
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
12 changes: 6 additions & 6 deletions apps/openvideo/app/layout.tsx → apps/openscene/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ import type { Metadata } from "next";
import "@theorvane/design-tokens/tokens.css";
import "./globals.css";

const siteUrl = new URL("https://open-video.app");
const title = "OpenVideo — the local-first video editor that edits with you";
const siteUrl = new URL("https://openscene.app");
const title = "OpenScene — the local-first video editor that edits with you";
const description = "An open-source desktop video editor with an AI agent that operates the timeline — cut, generate voice and video, and export with your own FFmpeg. Your media stays on your machine.";

export const metadata: Metadata = {
metadataBase: siteUrl,
title,
description,
applicationName: "OpenVideo",
keywords: ["OpenVideo", "AI video editor", "AI agent", "local-first", "video editor", "video generation", "text to speech", "Electron", "open source"],
applicationName: "OpenScene",
keywords: ["OpenScene", "AI video editor", "AI agent", "local-first", "video editor", "video generation", "text to speech", "Electron", "open source"],
authors: [{ name: "Theorvane", url: "https://theorvane.tech" }],
creator: "Theorvane",
publisher: "Theorvane",
category: "technology",
alternates: { canonical: "/" },
robots: { index: true, follow: true, googleBot: { index: true, follow: true, "max-image-preview": "large", "max-snippet": -1, "max-video-preview": -1 } },
openGraph: { type: "website", url: siteUrl, title, description, siteName: "OpenVideo", locale: "en_US" },
openGraph: { type: "website", url: siteUrl, title, description, siteName: "OpenScene", locale: "en_US" },
twitter: { card: "summary_large_image", title, description },
icons: {
icon: [{ url: "/icon.png", sizes: "460x460", type: "image/png" }],
Expand All @@ -31,7 +31,7 @@ export default function RootLayout({ children }: Readonly<{ children: React.Reac
return (
<html lang="en">
<head>
<script src="https://rybbit.handgarden.kr/api/script.js" data-site-id="765035acbe87" defer />
<script src="https://rybbit.handgarden.kr/api/script.js" data-site-id="c2c0972a916f" defer />
</head>
<body>{children}</body>
</html>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ImageResponse } from "next/og";

export const alt = "OpenVideo — the local-first video editor that edits with you";
export const alt = "OpenScene — the local-first video editor that edits with you";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";

Expand All @@ -22,7 +22,7 @@ export default function OpenGraphImage() {
<div style={{ display: "flex", alignItems: "center", gap: 18, fontSize: 34, fontWeight: 800, letterSpacing: "0.08em" }}>
<div style={{ width: 40, height: 40, borderRadius: 10, background: "#78f7bc" }} />
<div style={{ display: "flex" }}>
OPEN<span style={{ color: "#78f7bc" }}>VIDEO</span>
OPEN<span style={{ color: "#78f7bc" }}>SCENE</span>
</div>
</div>

Expand All @@ -40,7 +40,7 @@ export default function OpenGraphImage() {
</div>

<div style={{ display: "flex", justifyContent: "space-between", fontSize: 26, color: "#a5afc0", letterSpacing: "0.06em" }}>
<div style={{ display: "flex" }}>open-video.app</div>
<div style={{ display: "flex" }}>openscene.app</div>
<div style={{ display: "flex" }}>Theorvane</div>
</div>
</div>
Expand Down
Loading
Loading