Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
246933e
Add parity harness to lock feature correctness through native-CLI mig…
nmbrthirteen Jun 11, 2026
3b843d3
Add whisper.cpp transcription adapter behind the transcribe_file cont…
nmbrthirteen Jun 11, 2026
5932273
Add Go native launcher (Phase 0)
nmbrthirteen Jun 11, 2026
040f332
Wire transcription engine dispatch (whisper-py | whispercpp)
nmbrthirteen Jun 11, 2026
4a4eca1
Add model provisioner to the Go launcher
nmbrthirteen Jun 11, 2026
db113b2
Honor a hermetic ffmpeg/ffprobe across the backend
nmbrthirteen Jun 11, 2026
181bed9
Provision a hermetic ffmpeg/ffprobe via the Go launcher
nmbrthirteen Jun 11, 2026
8274217
Provision a hermetic CPython with slim, PyTorch-free deps
nmbrthirteen Jun 12, 2026
918db26
Add self-update check and the auto-update off-switch
nmbrthirteen Jun 12, 2026
ecd8238
Add npm/bun wrapper package for distribution
nmbrthirteen Jun 12, 2026
db2c349
Add release workflow: build 5 launcher binaries, release, publish npm
nmbrthirteen Jun 12, 2026
6ded3d2
Implement self-update binary download + atomic swap
nmbrthirteen Jun 12, 2026
723892a
Provision a hermetic whisper-cli (+ CI build job)
nmbrthirteen Jun 12, 2026
97ef053
Snap whisper.cpp word timings out of trailing silence
nmbrthirteen Jun 12, 2026
936fe72
Show pip progress during setup, not a silent hang
nmbrthirteen Jun 15, 2026
8747912
Scale model size units in doctor (KB/MB), not floor to 0 MB
nmbrthirteen Jun 15, 2026
f231eb1
Embed the Python backend in the launcher binary
nmbrthirteen Jun 15, 2026
2dabd7e
Restore the interactive menu and PodStack commands in the native CLI
nmbrthirteen Jun 15, 2026
c5f9d91
Degrade Web UI launch gracefully on a native install
nmbrthirteen Jun 15, 2026
53c4d9b
Serve the Web UI studio from a hermetic Node in native installs
nmbrthirteen Jun 15, 2026
36fe400
Resolve project data + .env from the working directory
nmbrthirteen Jun 15, 2026
f3791db
Harden the native install against dropped-dependency regressions
nmbrthirteen Jun 15, 2026
bfb0867
Ship the MCP server in the native CLI
nmbrthirteen Jun 15, 2026
69c8ace
Render captions + thumbnails via provisioned Remotion in native installs
nmbrthirteen Jun 15, 2026
ec91bd2
Fix native render gaps found in third audit
nmbrthirteen Jun 15, 2026
e3e95f1
Fix native release and whisper.cpp gaps
nmbrthirteen Jun 15, 2026
e6aa165
Harden native install: verify release checksums, pin download hosts, …
nmbrthirteen Jun 15, 2026
4d6cd4a
Make caption parity goldens host-independent
nmbrthirteen Jun 15, 2026
167f2c1
Address PR review comments
nmbrthirteen Jun 15, 2026
384a3d9
Make data global, render clips to the working dir, auto-select whispe…
nmbrthirteen Jun 16, 2026
1e22508
Add "find a specific moment" — paste text, AI locates it in the trans…
nmbrthirteen Jun 16, 2026
835f20d
Fix thumbnail crash + audit follow-ups
nmbrthirteen Jun 16, 2026
bdecf3d
Full-audit follow-ups: stdout discipline, asset-path rewrite, suggest…
nmbrthirteen Jun 16, 2026
0111fd4
Pin redirect hosts for runtime/model downloads
nmbrthirteen Jun 16, 2026
b1a04ed
Auto-provision on first run
nmbrthirteen Jun 16, 2026
75de4de
Fix thumbnail rendering: ensure the browser and cache it stably
nmbrthirteen Jun 16, 2026
d169c5d
Always produce a clip: default to ASS caption fallback
nmbrthirteen Jun 16, 2026
8fe8bc9
Add node-less native installers (curl / PowerShell)
nmbrthirteen Jun 16, 2026
e223dfd
Harden two file-path surfaces
nmbrthirteen Jun 16, 2026
108b8f5
Checksum-verify Node/CPython downloads; native-flow docs; release guide
nmbrthirteen Jun 16, 2026
97d8fdc
Align docs to the native install flow
nmbrthirteen Jun 16, 2026
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
183 changes: 183 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# Cuts a release on a v* tag: cross-compiles the Go launcher for all 5 targets,
# builds whisper.cpp per platform, publishes both as release assets (the names
# the npm wrapper, self-update, and provisioner expect), then publishes npm.
#
# The whisper.cpp matrix below is unverified until the first tagged run — the
# binary name / cmake flags may need adjustment for the pinned whisper.cpp ref.
name: release

on:
push:
tags:
- 'v*'

# Default to read-only; only the release job that publishes assets gets write.
permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- { goos: darwin, goarch: amd64 }
- { goos: darwin, goarch: arm64 }
- { goos: linux, goarch: amd64 }
- { goos: linux, goarch: arm64 }
- { goos: windows, goarch: amd64 }
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Build launcher
working-directory: cli
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
CGO_ENABLED: '0'
run: |
VERSION="${GITHUB_REF_NAME#v}"
go generate ./... # sync backend + PodStack commands for go:embed
EXT=""
[ "${{ matrix.goos }}" = "windows" ] && EXT=".exe"
OUT="podcli-${{ matrix.goos }}-${{ matrix.goarch }}${EXT}"
go build -trimpath -ldflags "-s -w -X main.Version=${VERSION}" -o "../${OUT}" .
echo "ASSET=${OUT}" >> "$GITHUB_ENV"
- uses: actions/upload-artifact@v4
with:
name: ${{ env.ASSET }}
path: ${{ env.ASSET }}

whisper:
strategy:
fail-fast: false
matrix:
include:
- { runner: macos-14, goos: darwin, goarch: arm64 }
- { runner: macos-13, goos: darwin, goarch: amd64 }
- { runner: ubuntu-latest, goos: linux, goarch: amd64 }
- { runner: ubuntu-24.04-arm, goos: linux, goarch: arm64 }
- { runner: windows-latest, goos: windows, goarch: amd64 }
runs-on: ${{ matrix.runner }}
env:
WHISPER_REF: v1.7.4 # pin a known-good whisper.cpp tag
steps:
- name: Clone whisper.cpp
uses: actions/checkout@v4
with:
repository: ggml-org/whisper.cpp
ref: ${{ env.WHISPER_REF }}
- name: Build (static; Metal embedded on macOS)
shell: bash
run: |
EXTRA=""
if [ "${{ matrix.goos }}" = "darwin" ]; then EXTRA="-DGGML_METAL_EMBED_LIBRARY=ON"; fi
cmake -B build -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release $EXTRA
cmake --build build --config Release --target whisper-cli -j
- name: Stage asset
shell: bash
run: |
EXT=""; [ "${{ matrix.goos }}" = "windows" ] && EXT=".exe"
SRC=$(find build -name "whisper-cli${EXT}" -type f | head -1)
OUT="whisper-cli-${{ matrix.goos }}-${{ matrix.goarch }}${EXT}"
cp "$SRC" "$OUT"
echo "ASSET=$OUT" >> "$GITHUB_ENV"
- uses: actions/upload-artifact@v4
with:
name: ${{ env.ASSET }}
path: ${{ env.ASSET }}

studio:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Build studio bundle
run: |
npm ci
sh scripts/build-studio.sh dist/studio
tar -czf studio-bundle.tar.gz -C dist/studio .
- uses: actions/upload-artifact@v4
with:
name: studio-bundle.tar.gz
path: studio-bundle.tar.gz

remotion:
# Per-platform: @rspack and the Remotion compositor ship native binaries, so
# the bundle is not portable across os/arch.
strategy:
fail-fast: false
matrix:
include:
- { runner: macos-14, goos: darwin, goarch: arm64 }
- { runner: macos-13, goos: darwin, goarch: amd64 }
- { runner: ubuntu-latest, goos: linux, goarch: amd64 }
- { runner: ubuntu-24.04-arm, goos: linux, goarch: arm64 }
- { runner: windows-latest, goos: windows, goarch: amd64 }
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Build remotion bundle
shell: bash
run: |
sh scripts/build-remotion.sh dist/remotion-bundle
OUT="remotion-bundle-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz"
tar -czf "$OUT" -C dist/remotion-bundle .
echo "ASSET=$OUT" >> "$GITHUB_ENV"
- uses: actions/upload-artifact@v4
with:
name: ${{ env.ASSET }}
path: ${{ env.ASSET }}

release:
needs: [build, whisper, studio, remotion]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Generate checksums
working-directory: dist
run: |
sha256sum * > "$RUNNER_TEMP/checksums.txt"
mv "$RUNNER_TEMP/checksums.txt" checksums.txt
- uses: softprops/action-gh-release@v2
with:
files: dist/*
generate_release_notes: true

publish-npm:
needs: release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- name: Assert NPM_TOKEN is set
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
if [ -z "$NODE_AUTH_TOKEN" ]; then
echo "::error::NPM_TOKEN secret is not set — refusing to publish. The GitHub release and assets are already published; set the secret and re-run this job." >&2
exit 1
fi
- name: Publish wrapper pinned to the tag
working-directory: npm
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
VERSION="${GITHUB_REF_NAME#v}"
npm version "$VERSION" --no-git-tag-version --allow-same-version
npm publish --access public
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ episodes/
*.srt
uploads/
output/
cli/internal/backend/files/
cli/internal/podstack/commands/
cli/podcli
podcli-clips/
3 changes: 2 additions & 1 deletion AGENTS.podstack.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ PodStack ships one source-of-truth (`commands/`) and installs to the right locat
| opencode | `.opencode/commands/*.md` | `AGENTS.md` |
| Generic | `commands/*.md` | `AGENTS.md` |

Install: `./setup.sh --host <name>`. See `README.md` for per-host usage examples.
These command files ship with podcli; place the set for your tool (left column) in
its command dir. See `README.md` for per-host usage examples.

---

Expand Down
38 changes: 30 additions & 8 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,41 @@

Thank you for helping improve podcli. This project is AGPL-3.0 — contributions are welcome under the same license.

## Architecture

podcli ships as a native Go launcher (`cli/`) that provisions hermetic runtimes
and routes commands to the Python backend (`backend/`) and the Node studio/MCP
server (`src/`). End users install a prebuilt binary; the source trees below are
for development.

## Development setup

Backend (Python) + studio (TypeScript):

```bash
./setup.sh
./setup.sh # venv + Python deps
npm install
npm run build
npm run build # tsc + studio bundle
```

Native launcher (Go 1.23+):

```bash
cd cli
go generate ./... # sync backend + PodStack commands for go:embed
go build -o podcli .
```

Python backend lives in `backend/`. TypeScript MCP server and Web UI live in `src/`.
`cli/internal/backend/files/` is generated by `go generate` (gitignored) — edit
the canonical `backend/` instead.

## Project layout

| Path | Purpose |
| Path | Purpose |
| --------------------------------------- | --------------------------------------------------------------- |
| `cli/` | Go launcher — provisioning, self-update, command routing |
| `backend/` | Python engine (transcription, rendering, clip generation) |
| `src/` | TypeScript MCP server + Web UI |
| `.podcli/` | Config home (knowledge, presets, assets, settings) — gitignored |
| `data/` | Runtime data (cache, output, working) — gitignored |
| `backend/config/paths.py` | Canonical path resolution (Python) |
Expand All @@ -25,10 +46,11 @@ Python backend lives in `backend/`. TypeScript MCP server and Web UI live in `sr

## Before you open a PR

1. Run tests: `python3 -m unittest discover -s tests -v`
2. Run TypeScript build: `npm run build`
3. If you change paths, env vars, or cache layout, update `README.md` and add a note to the config migration logic.
4. Keep diffs focused — one feature or fix per PR when possible.
1. Python tests: `python3 -m pytest tests/ -q`
2. TypeScript: `npm run build` and `npx vitest run`
3. Go (if you touched `cli/`): `cd cli && go build ./... && go test ./... && gofmt -l .`
4. If you change paths, env vars, or cache layout, update `README.md` and the config migration logic, and keep `backend/config/paths.py` and `src/config/paths.ts` aligned.
5. Keep diffs focused — one feature or fix per PR when possible.

## Path and cache conventions

Expand Down
Loading
Loading