Files
recap/startos/versions/v0.2.64.ts
T
Keysat 0ae59f3550 Add multi-tenant cloud mode: self-serve purchase, credit metering, core-decoupling
Introduces RECAP_MODE=multi alongside single-mode self-host:
- Tenant auth + accounts (magic-link via System SMTP), per-tenant credit pool,
  anonymous trial minting with per-IP/-64 caps
- Self-serve Pro/Max purchase: inline Lightning (BTCPay) + card (Zaprite),
  prepaid 30-day periods, expiry-reminder emails
- Core-decoupling: relay owns cloud tier/expiry keyed by Recaps user-id
- SQLite (better-sqlite3) schema for multi-mode; filesystem unchanged for single
- StartOS actions/versions through 0.2.155
2026-06-13 14:25:05 -05:00

13 lines
1.6 KiB
TypeScript

import { VersionInfo } from '@start9labs/start-sdk'
export const v_0_2_64 = VersionInfo.of({
version: '0.2.64:0',
releaseNotes: {
en_US: 'Speed + UI fixes for long content. (1) Client-side audio chunking now runs in parallel (up to 6 chunks in flight) instead of serially. Previously, a 90-min video split into 2 chunks would transcribe them one after the other; now they overlap, halving wall-time on the multi-chunk path. Out-of-order completion is handled correctly via index-based merge after all chunks return. (2) Topic-analysis concurrency bumped from 4 to 12 in-flight windows. Stays well under Gemini paid Tier 1 RPM caps (1000 RPM for flash, 150 RPM for pro) and saturates a single Spark for the operator-hardware path. (3) Periodic relay-status poll no longer triggers a full re-render every 60 seconds. The poll now compares previous vs new relay state and only re-renders if something actually changed — eliminates the full-screen flicker and scroll-jump that was happening on every minute mark. (4) Clicking the chevron on an activity-log group header now toggles only that group\'s body display + chevron icon instead of rebuilding the entire app DOM. No more flash-and-scroll-to-top when collapsing a log section. (5) YouTube embed no longer flickers / goes black after Cancel mid-stream. The render-time mount logic now checks whether the yt-player div already has an iframe child; if so, the existing player is left in place instead of destroyed and recreated.',
},
migrations: {
up: async ({ effects }) => {},
down: async ({ effects }) => {},
},
})