Rename project: youtube-summarizer → recap

The product was always more than YouTube — it handles podcast feeds
too, and the upcoming multi-provider work makes it less Gemini-
specific. New name: Recap.

This is a coordinated identity change across:

  • StartOS package id: youtube-summarizer → recap
    (manifest.id; the .s9pk filename, Docker image namespace, and
    install path under StartOS all derive from this automatically)
  • Display name: "YouTube Summarizer" → "Recap"
    (manifest title, activation screen heading, page <title>, console
    log on boot, i18n strings, ABOUT.md, Dockerfile header,
    docker_entrypoint banner)
  • Keysat product slug: youtube-summarizer → recap
    (server/license.js PRODUCT_SLUG; frontend fallback strings)
  • Daemon subscription id: youtube-summarizer-sub → recap-sub
  • Env var prefix: YT_SUMMARIZER_* → RECAP_*
    (LICENSE_KEY, LICENSE_KEY_PATH, MAX_OFFLINE_DAYS,
    VALIDATE_INTERVAL_MS)
  • localStorage keys: yt-summarizer-* → recap-*
    (gemini-key, activation-skipped, clips)
  • Library export filename: youtube-summarizer-library.json →
    recap-library.json
  • npm package names: youtube-summarizer-{startos,server} → recap-*
  • Deploy paths: youtube-summarizer_x86_64.s9pk → recap_x86_64.s9pk
    (default values in bin/deploy.sh; .deploy.env on dev machine
    needs the same update before next push)
  • Self-hosted registry directory: startos-registry/packages/
    youtube-summarizer → .../recap (with package.json + INSTRUCTIONS
    rewritten)

What does NOT change:
  • Filesystem repo path (still /Users/.../youtube-summarizer/)
  • Git history / commit messages
  • Existing version files in startos/versions/ (kept as-is — the
    version chain belongs to the package's own history regardless of
    its display name)

User-side follow-ups required:
  1. Create "recap" product in Keysat admin, set up Core/Pro tier
     policies (same entitlements as before), mint a fresh test
     license. Old "youtube-summarizer" licenses won't activate
     against the new slug.
  2. Update .deploy.env (gitignored) so FILEBROWSER_PATH and
     REGISTRY_PUBLIC_URL point at recap_x86_64.s9pk.

StartOS will treat this as a brand-new app on install — existing
youtube-summarizer installs will not auto-migrate (acknowledged
intentional given no real users yet).
This commit is contained in:
Keysat
2026-05-08 13:35:27 -05:00
parent 1aaa7a453a
commit 9282440143
23 changed files with 59 additions and 59 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
import { sdk } from './sdk'
// YouTube Summarizer has no dependencies on other StartOS services.
// Recap has no dependencies on other StartOS services.
export const setDependencies = sdk.setupDependencies(async ({ effects }) => {
return {}
})
+4 -4
View File
@@ -2,14 +2,14 @@ export const DEFAULT_LANG = 'en_US'
const dict = {
// main.ts
'Starting YouTube Summarizer...': 0,
'Starting Recap...': 0,
'Web Interface': 1,
'YouTube Summarizer is ready': 2,
'YouTube Summarizer is not responding': 3,
'Recap is ready': 2,
'Recap is not responding': 3,
// interfaces.ts
'Web UI': 4,
'The web interface for YouTube Summarizer — browse, search, and manage your transcript library': 5,
'The web interface for Recap — browse, search, and manage your transcript library': 5,
} as const
/**
+1 -1
View File
@@ -1,6 +1,6 @@
import { sdk } from '../sdk'
// YouTube Summarizer needs no special initialization.
// Recap needs no special initialization.
// Directories are created by docker_entrypoint.sh and
// config is loaded from the persistent volume at runtime.
export const setup = sdk.setupOnInit(async (effects, kind) => {
+1 -1
View File
@@ -11,7 +11,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
name: i18n('Web UI'),
id: 'ui',
description: i18n(
'The web interface for YouTube Summarizer — browse, search, and manage your transcript library',
'The web interface for Recap — browse, search, and manage your transcript library',
),
type: 'ui',
masked: false,
+4 -4
View File
@@ -3,7 +3,7 @@ import { sdk } from './sdk'
import { uiPort } from './utils'
export const main = sdk.setupMain(async ({ effects }) => {
console.info(i18n('Starting YouTube Summarizer...'))
console.info(i18n('Starting Recap...'))
return sdk.Daemons.of(effects).addDaemon('primary', {
subcontainer: await sdk.SubContainer.of(
@@ -15,7 +15,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
mountpoint: '/data',
readonly: false,
}),
'youtube-summarizer-sub',
'recap-sub',
),
exec: {
command: [
@@ -28,8 +28,8 @@ export const main = sdk.setupMain(async ({ effects }) => {
display: i18n('Web Interface'),
fn: () =>
sdk.healthCheck.checkPortListening(effects, uiPort, {
successMessage: i18n('YouTube Summarizer is ready'),
errorMessage: i18n('YouTube Summarizer is not responding'),
successMessage: i18n('Recap is ready'),
errorMessage: i18n('Recap is not responding'),
}),
},
requires: [],
+1 -1
View File
@@ -5,7 +5,7 @@ export const short = {
export const long = {
en_US:
'YouTube Summarizer downloads audio from YouTube videos and podcast RSS feeds, ' +
'Recap downloads audio from YouTube videos and podcast RSS feeds, ' +
'transcribes them using Google Gemini, and produces structured topic-by-topic ' +
'summaries with timestamps. Features include channel and podcast subscriptions ' +
'with automatic new episode detection, a background processing queue with ' +
+2 -2
View File
@@ -2,8 +2,8 @@ import { setupManifest } from '@start9labs/start-sdk'
import { alertInstall, long, short } from './i18n'
export const manifest = setupManifest({
id: 'youtube-summarizer',
title: 'YouTube Summarizer',
id: 'recap',
title: 'Recap',
license: 'Proprietary',
packageRepo: 'https://ten31.xyz',
upstreamRepo: 'https://ten31.xyz',