Thank you for helping improve podcli. This project is AGPL-3.0 — contributions are welcome under the same license.
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.
Backend (Python) + studio (TypeScript):
./setup.sh # venv + Python deps
npm install
npm run build # tsc + studio bundleNative launcher (Go 1.23+):
cd cli
go generate ./... # sync backend + PodStack commands for go:embed
go build -o podcli .cli/internal/backend/files/ is generated by go generate (gitignored) — edit
the canonical backend/ instead.
| 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) |
src/config/paths.ts |
Path resolution for Node (must stay aligned) |
backend/config_bundle.py |
Portable profile export/import |
backend/services/transcript_packer.py |
Transcript cache keys + packed markdown |
- Python tests:
python3 -m pytest tests/ -q - TypeScript:
npm run buildandnpx vitest run - Go (if you touched
cli/):cd cli && go build ./... && go test ./... && gofmt -l . - If you change paths, env vars, or cache layout, update
README.mdand the config migration logic, and keepbackend/config/paths.pyandsrc/config/paths.tsaligned. - Keep diffs focused — one feature or fix per PR when possible.
- Config home (
PODCLI_HOMEor.podcli-homemarker): portable settings only. - Data dir (
PODCLI_DATAordata/): transcripts cache, outputs, temp files. - Transcript cache:
data/cache/transcripts/{16-char-hash}.json— same hash algorithm in Python (compute_cache_hash) and TypeScript (TranscriptCache).
Do not reintroduce a separate CLI-only cache path without updating both sides.
- Create
backend/services/integrations/<name>/withIntegrationBasesubclass. - Register in that package’s
__init__.py. - Add MCP tool wiring in
src/server.ts(or a thin handler) and optional UI toggle at/integrations.html.
- Config import uses zip path validation (
_safe_extract_zip). Do not replace with rawextractallon untrusted archives. - Do not commit
.env, API keys, or personal media under.podcli/ordata/.
Open a GitHub issue with reproduction steps for bugs, or a short design note for larger features.