textflowkit 0.1.3__tar.gz → 0.1.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {textflowkit-0.1.3 → textflowkit-0.1.5}/.gitattributes +22 -22
- {textflowkit-0.1.3 → textflowkit-0.1.5}/.github/workflows/ci.yml +4 -2
- textflowkit-0.1.5/.github/workflows/publish-pypi.yml +114 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/.gitignore +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/.pre-commit-config.yaml +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/CONTRIBUTING.md +4 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/LEGAL.md +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/LICENSE +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/PKG-INFO +78 -29
- {textflowkit-0.1.3 → textflowkit-0.1.5}/README.md +71 -27
- {textflowkit-0.1.3 → textflowkit-0.1.5}/SECURITY.md +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/adapters.md +13 -4
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/index.html +6 -7
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/install.md +10 -4
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/release-checklist.md +36 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/roadmap.md +28 -0
- textflowkit-0.1.5/docs/site-deployment.md +34 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/pyproject.toml +10 -3
- {textflowkit-0.1.3 → textflowkit-0.1.5}/scripts/smoke_installed_wheel.py +34 -3
- textflowkit-0.1.5/src/textflowkit/__init__.py +8 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/__init__.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/http_server.py +5 -4
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/mcp_server.py +6 -2
- textflowkit-0.1.5/src/textflowkit/assets/README.md +8 -0
- textflowkit-0.1.5/src/textflowkit/assets/selftest-speech.wav +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/cli.py +19 -26
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/__init__.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/cancel.py +19 -19
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/engine.py +12 -4
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/model.py +34 -7
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/pipeline.py +13 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/submission.py +3 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/timeutil.py +2 -2
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/__init__.py +15 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/docx.py +71 -71
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/markdown.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/pdf.py +9 -5
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/srt.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/txt.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/vtt.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/__init__.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/detect.py +200 -200
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/ollama_stub.py +110 -110
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_adapters.py +57 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_batch.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_engine_cache.py +21 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_export.py +11 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_jobs.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_model.py +11 -2
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_pipeline_integrity.py +48 -3
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_release_boundaries.py +17 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_render.py +99 -99
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_sources.py +2 -2
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_stdio_protocol.py +213 -213
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_submission.py +26 -0
- textflowkit-0.1.3/src/textflowkit/__init__.py +0 -8
- textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSans.ttf +0 -0
- textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSansArabic.ttf +0 -0
- textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSansSC.ttf +0 -0
- textflowkit-0.1.3/src/textflowkit/render/fonts/OFL-NotoSans.txt +0 -94
- textflowkit-0.1.3/src/textflowkit/render/fonts/OFL-NotoSansSC.txt +0 -93
- textflowkit-0.1.3/src/textflowkit/render/fonts/README.md +0 -19
- {textflowkit-0.1.3 → textflowkit-0.1.5}/.github/dependabot.yml +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/.nojekyll +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/sources.md +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/scripts/smoke_live_youtube.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/batch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/bind.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/checkpoint.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/diarize.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/executor.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/jobs.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/paths.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/retrieval.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/runner.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/service.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/sqlite_store.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/translate.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/acquire.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/scratch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_acquire.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_bind.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_checkpoint.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_cli.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_cli_resume_batch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_diarize.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_executor.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_landing_page.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_live_smoke_script.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_paths.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_retrieval.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_service_profile.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_translate.py +0 -0
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# Normalise line endings so a build is the same on every platform.
|
|
2
|
-
#
|
|
3
|
-
# Without this, core.autocrlf rewrites text files on Windows checkout, so a
|
|
4
|
-
# wheel built from a Windows clone differs byte-for-byte from one built on
|
|
5
|
-
# Linux - same code, different bytes - and a published hash cannot be
|
|
6
|
-
# reproduced. Text is stored as LF in the repository and in every build.
|
|
7
|
-
* text=auto eol=lf
|
|
8
|
-
|
|
9
|
-
# Binary assets must never be rewritten.
|
|
10
|
-
*.png binary
|
|
11
|
-
*.jpg binary
|
|
12
|
-
*.jpeg binary
|
|
13
|
-
*.gif binary
|
|
14
|
-
*.ico binary
|
|
15
|
-
*.pdf binary
|
|
16
|
-
*.docx binary
|
|
17
|
-
*.whl binary
|
|
18
|
-
*.gz binary
|
|
19
|
-
|
|
20
|
-
# Windows-only scripts keep CRLF.
|
|
21
|
-
*.bat text eol=crlf
|
|
22
|
-
*.cmd text eol=crlf
|
|
1
|
+
# Normalise line endings so a build is the same on every platform.
|
|
2
|
+
#
|
|
3
|
+
# Without this, core.autocrlf rewrites text files on Windows checkout, so a
|
|
4
|
+
# wheel built from a Windows clone differs byte-for-byte from one built on
|
|
5
|
+
# Linux - same code, different bytes - and a published hash cannot be
|
|
6
|
+
# reproduced. Text is stored as LF in the repository and in every build.
|
|
7
|
+
* text=auto eol=lf
|
|
8
|
+
|
|
9
|
+
# Binary assets must never be rewritten.
|
|
10
|
+
*.png binary
|
|
11
|
+
*.jpg binary
|
|
12
|
+
*.jpeg binary
|
|
13
|
+
*.gif binary
|
|
14
|
+
*.ico binary
|
|
15
|
+
*.pdf binary
|
|
16
|
+
*.docx binary
|
|
17
|
+
*.whl binary
|
|
18
|
+
*.gz binary
|
|
19
|
+
|
|
20
|
+
# Windows-only scripts keep CRLF.
|
|
21
|
+
*.bat text eol=crlf
|
|
22
|
+
*.cmd text eol=crlf
|
|
@@ -57,7 +57,8 @@ jobs:
|
|
|
57
57
|
shell: bash
|
|
58
58
|
run: |
|
|
59
59
|
python -m pip install --upgrade pip
|
|
60
|
-
python -m pip install -
|
|
60
|
+
python -m pip install ./packages/textflowkit-fonts
|
|
61
|
+
python -m pip install -e ".[dev,mcp,http,export]"
|
|
61
62
|
|
|
62
63
|
- name: Show ffmpeg version
|
|
63
64
|
shell: bash
|
|
@@ -84,6 +85,7 @@ jobs:
|
|
|
84
85
|
run: |
|
|
85
86
|
python -m pip install "setuptools>=83" "build>=1.2"
|
|
86
87
|
python -m build --wheel
|
|
88
|
+
python -m build --wheel --outdir dist packages/textflowkit-fonts
|
|
87
89
|
- name: Smoke all three installed entry points
|
|
88
90
|
shell: bash
|
|
89
|
-
run: python scripts/smoke_installed_wheel.py dist
|
|
91
|
+
run: python scripts/smoke_installed_wheel.py dist/textflowkit-*.whl dist/textflowkit_fonts-*.whl
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
name: Publish PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*']
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
if: github.repository == 'scottconverse/textflowkit'
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
16
|
+
with:
|
|
17
|
+
persist-credentials: false
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
20
|
+
with:
|
|
21
|
+
python-version: '3.12'
|
|
22
|
+
- run: python -m pip install packaging
|
|
23
|
+
- name: Verify release tag and package versions
|
|
24
|
+
env:
|
|
25
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
26
|
+
run: |
|
|
27
|
+
python - <<'PY'
|
|
28
|
+
import os, tomllib
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from packaging.version import Version
|
|
31
|
+
|
|
32
|
+
tag = os.environ['RELEASE_TAG']
|
|
33
|
+
if not tag.startswith('v'):
|
|
34
|
+
raise SystemExit('Release tag must start with v')
|
|
35
|
+
version = str(Version(tag[1:]))
|
|
36
|
+
if tag != 'v' + version:
|
|
37
|
+
raise SystemExit('Release tag is not a normalized final version')
|
|
38
|
+
if Version(version).is_prerelease or Version(version).is_devrelease:
|
|
39
|
+
raise SystemExit('PyPI release must be a final version')
|
|
40
|
+
for file in (Path('pyproject.toml'), Path('packages/textflowkit-fonts/pyproject.toml')):
|
|
41
|
+
declared = tomllib.loads(file.read_text(encoding='utf-8'))['project']['version']
|
|
42
|
+
if declared != version:
|
|
43
|
+
raise SystemExit(f'{file}: {declared} != {version}')
|
|
44
|
+
PY
|
|
45
|
+
git merge-base --is-ancestor "$GITHUB_SHA" origin/main || {
|
|
46
|
+
echo 'Release tag is not merged into main' >&2
|
|
47
|
+
exit 1
|
|
48
|
+
}
|
|
49
|
+
- name: Build distributions
|
|
50
|
+
run: |
|
|
51
|
+
python -m pip install --upgrade build packaging
|
|
52
|
+
python -m build --sdist --wheel --outdir dist/main .
|
|
53
|
+
python -m build --sdist --wheel --outdir dist/fonts packages/textflowkit-fonts
|
|
54
|
+
python -m pip install twine
|
|
55
|
+
python -m twine check dist/main/* dist/fonts/*
|
|
56
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
57
|
+
with:
|
|
58
|
+
name: distributions
|
|
59
|
+
path: dist/
|
|
60
|
+
if-no-files-found: error
|
|
61
|
+
|
|
62
|
+
publish-fonts:
|
|
63
|
+
needs: build
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
environment: pypi
|
|
66
|
+
permissions:
|
|
67
|
+
id-token: write
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
70
|
+
with:
|
|
71
|
+
name: distributions
|
|
72
|
+
path: dist/
|
|
73
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
74
|
+
with:
|
|
75
|
+
packages-dir: dist/fonts/
|
|
76
|
+
|
|
77
|
+
publish-main:
|
|
78
|
+
needs: publish-fonts
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
environment: pypi
|
|
81
|
+
permissions:
|
|
82
|
+
id-token: write
|
|
83
|
+
steps:
|
|
84
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
85
|
+
with:
|
|
86
|
+
name: distributions
|
|
87
|
+
path: dist/
|
|
88
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
89
|
+
with:
|
|
90
|
+
packages-dir: dist/main/
|
|
91
|
+
|
|
92
|
+
publish-github-release:
|
|
93
|
+
needs: publish-main
|
|
94
|
+
runs-on: ubuntu-latest
|
|
95
|
+
permissions:
|
|
96
|
+
contents: write
|
|
97
|
+
steps:
|
|
98
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
99
|
+
with:
|
|
100
|
+
name: distributions
|
|
101
|
+
path: dist/
|
|
102
|
+
- name: Create draft with the exact PyPI distributions
|
|
103
|
+
env:
|
|
104
|
+
GH_TOKEN: ${{ github.token }}
|
|
105
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
106
|
+
run: |
|
|
107
|
+
gh release create "$RELEASE_TAG" dist/main/* dist/fonts/* \
|
|
108
|
+
--repo "$GITHUB_REPOSITORY" --verify-tag --draft \
|
|
109
|
+
--title "$RELEASE_TAG" --generate-notes
|
|
110
|
+
- name: Publish complete GitHub release
|
|
111
|
+
env:
|
|
112
|
+
GH_TOKEN: ${{ github.token }}
|
|
113
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
114
|
+
run: gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --draft=false
|
|
@@ -13,7 +13,8 @@ cd textflowkit
|
|
|
13
13
|
python -m venv .venv
|
|
14
14
|
# Windows: .venv\Scripts\activate
|
|
15
15
|
# POSIX: source .venv/bin/activate
|
|
16
|
-
pip install -
|
|
16
|
+
pip install ./packages/textflowkit-fonts # local optional PDF font companion
|
|
17
|
+
pip install -e ".[dev,mcp,http,export]"
|
|
17
18
|
```
|
|
18
19
|
|
|
19
20
|
## Test and lint — the commands CI runs
|
|
@@ -60,6 +61,8 @@ mark it so it can be skipped in CI.
|
|
|
60
61
|
- Add a test for a bug fix. If you cannot, say why in the PR description.
|
|
61
62
|
- Run `ruff check .` and `python -m pytest` before opening the PR.
|
|
62
63
|
- Do not commit media files, transcripts, or scratch output. `work/` is gitignored.
|
|
64
|
+
The bundled `src/textflowkit/assets/selftest-speech.wav` is an intentional,
|
|
65
|
+
small synthetic speech fixture; do not replace it with private recordings.
|
|
63
66
|
|
|
64
67
|
## Evidence language
|
|
65
68
|
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: textflowkit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: Cross-platform media transcription toolkit: URL or file in, timestamped transcripts and subtitle files out.
|
|
5
|
-
Project-URL: Homepage, https://
|
|
5
|
+
Project-URL: Homepage, https://www.textflowkit.org/
|
|
6
6
|
Project-URL: Issues, https://github.com/scottconverse/textflowkit/issues
|
|
7
|
+
Project-URL: Source, https://github.com/scottconverse/textflowkit
|
|
8
|
+
Project-URL: Documentation, https://github.com/scottconverse/textflowkit/tree/main/docs
|
|
9
|
+
Project-URL: Changelog, https://github.com/scottconverse/textflowkit/releases
|
|
7
10
|
License-Expression: Apache-2.0
|
|
8
11
|
License-File: LICENSE
|
|
9
12
|
Keywords: speech-to-text,srt,subtitles,transcription,vtt,whisper,yt-dlp
|
|
@@ -27,6 +30,7 @@ Requires-Dist: pyannote-audio>=4.0; extra == 'all'
|
|
|
27
30
|
Requires-Dist: pydantic>=2.7; extra == 'all'
|
|
28
31
|
Requires-Dist: python-docx>=1.1; extra == 'all'
|
|
29
32
|
Requires-Dist: reportlab>=4.0; extra == 'all'
|
|
33
|
+
Requires-Dist: textflowkit-fonts<0.2,>=0.1.5; extra == 'all'
|
|
30
34
|
Requires-Dist: uvicorn>=0.30; extra == 'all'
|
|
31
35
|
Provides-Extra: dev
|
|
32
36
|
Requires-Dist: pypdf>=5; extra == 'dev'
|
|
@@ -38,6 +42,7 @@ Requires-Dist: pyannote-audio>=4.0; extra == 'diarize'
|
|
|
38
42
|
Provides-Extra: export
|
|
39
43
|
Requires-Dist: python-docx>=1.1; extra == 'export'
|
|
40
44
|
Requires-Dist: reportlab>=4.0; extra == 'export'
|
|
45
|
+
Requires-Dist: textflowkit-fonts<0.2,>=0.1.5; extra == 'export'
|
|
41
46
|
Provides-Extra: http
|
|
42
47
|
Requires-Dist: fastapi>=0.115; extra == 'http'
|
|
43
48
|
Requires-Dist: pydantic>=2.7; extra == 'http'
|
|
@@ -50,9 +55,14 @@ Description-Content-Type: text/markdown
|
|
|
50
55
|
|
|
51
56
|
Cross-platform media transcription toolkit. **One core, one CLI, thin adapters.**
|
|
52
57
|
|
|
53
|
-
[Project landing page](https://
|
|
58
|
+
[Project landing page](https://www.textflowkit.org/) ·
|
|
59
|
+
[PyPI package](https://pypi.org/project/textflowkit/) ·
|
|
54
60
|
[GitHub releases](https://github.com/scottconverse/textflowkit/releases)
|
|
55
61
|
|
|
62
|
+
The [static site deployment](https://github.com/scottconverse/textflowkit/blob/main/docs/site-deployment.md) is hosted on Cloudflare
|
|
63
|
+
Pages. GitHub remains the source and CI host; the website does not run the
|
|
64
|
+
transcription engine.
|
|
65
|
+
|
|
56
66
|
Paste a URL or point at a file; get timestamped transcripts and subtitle files back.
|
|
57
67
|
Built as a reusable primitive for developers — designed to sit under multiple
|
|
58
68
|
products, AI harnesses, and agents.
|
|
@@ -63,12 +73,12 @@ products, AI harnesses, and agents.
|
|
|
63
73
|
>
|
|
64
74
|
> **This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND**, express or
|
|
65
75
|
> implied, including but not limited to the warranties of MERCHANTABILITY, FITNESS
|
|
66
|
-
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](LICENSE) (Apache-2.0,
|
|
76
|
+
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE) (Apache-2.0,
|
|
67
77
|
> §7–8) for the full disclaimer and limitation of liability.
|
|
68
78
|
>
|
|
69
79
|
> **You are responsible for what you transcribe.** textflowkit can fetch media from
|
|
70
80
|
> third-party platforms. Copyright, terms-of-service, and privacy obligations for any
|
|
71
|
-
> media you choose to process are **yours alone**. See [LEGAL.md](LEGAL.md).
|
|
81
|
+
> media you choose to process are **yours alone**. See [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md).
|
|
72
82
|
|
|
73
83
|
---
|
|
74
84
|
|
|
@@ -112,40 +122,79 @@ YouTube · TikTok · Facebook · Instagram · Vimeo · Twitch · Bilibili · Rum
|
|
|
112
122
|
Kick · Zoom · Medal · Loom · Dropbox — plus **direct media URLs and local files**.
|
|
113
123
|
|
|
114
124
|
All 13 are recognised through `yt-dlp`; only YouTube has an opt-in, maintained
|
|
115
|
-
[live end-to-end smoke](docs/release-checklist.md). It is run on a Windows
|
|
125
|
+
[live end-to-end smoke](https://github.com/scottconverse/textflowkit/blob/main/docs/release-checklist.md). It is run on a Windows
|
|
116
126
|
maintainer machine before a release, not on GitHub-hosted runners or every pull
|
|
117
127
|
request. Local files have also been transcribed live. The other
|
|
118
128
|
12 are not release-verified end to end, and some sources require cookies or
|
|
119
|
-
change their access rules frequently. See [docs/sources.md](docs/sources.md).
|
|
129
|
+
change their access rules frequently. See [docs/sources.md](https://github.com/scottconverse/textflowkit/blob/main/docs/sources.md).
|
|
120
130
|
|
|
121
131
|
## Install
|
|
122
132
|
|
|
123
133
|
Requires **Python ≥ 3.10** and **ffmpeg** on `PATH`.
|
|
124
134
|
|
|
125
135
|
```bash
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
pip install -e .
|
|
136
|
+
python -m pip install textflowkit
|
|
137
|
+
textflowkit doctor
|
|
129
138
|
```
|
|
130
139
|
|
|
131
|
-
|
|
140
|
+
For MCP or the JSON HTTP adapter, install the matching extra:
|
|
132
141
|
|
|
133
142
|
```bash
|
|
134
|
-
pip install
|
|
143
|
+
python -m pip install 'textflowkit[mcp]' # MCP server
|
|
144
|
+
python -m pip install 'textflowkit[http]' # JSON HTTP API
|
|
135
145
|
```
|
|
136
146
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
kept out of this file: the README is bundled into the wheel as its description,
|
|
140
|
-
so a hash written here would change the artifact it describes.)
|
|
141
|
-
Optional extras:
|
|
147
|
+
PDF/DOCX export is optional. The default wheel stays small; the `export` extra
|
|
148
|
+
installs `textflowkit-fonts` for offline multilingual PDF rendering:
|
|
142
149
|
|
|
143
150
|
```bash
|
|
144
|
-
pip install
|
|
145
|
-
|
|
146
|
-
|
|
151
|
+
python -m pip install 'textflowkit[export]'
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Python API
|
|
155
|
+
|
|
156
|
+
The same pipeline used by the CLI and adapters is available to Python callers:
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from textflowkit import transcribe
|
|
160
|
+
|
|
161
|
+
result = transcribe(
|
|
162
|
+
"meeting.mp4", # also accepts supported URLs
|
|
163
|
+
model="small",
|
|
164
|
+
formats=["json", "srt", "txt"],
|
|
165
|
+
output_dir="transcripts", # omit to return the transcript without writing files
|
|
166
|
+
)
|
|
167
|
+
print(result.transcript.text)
|
|
168
|
+
print(result.transcript.duration) # full media duration in seconds
|
|
169
|
+
print(result.outputs) # pathlib.Path objects for written files
|
|
170
|
+
for segment in result.transcript.segments:
|
|
171
|
+
print(segment.start, segment.end, segment.speaker, segment.text)
|
|
172
|
+
for word in segment.words:
|
|
173
|
+
print(" ", word.start, word.end, word.text)
|
|
147
174
|
```
|
|
148
175
|
|
|
176
|
+
`transcribe()` returns `TranscribeResult` with a canonical `Transcript` and
|
|
177
|
+
written output paths. `Transcript.to_dict()` / `.to_json()` preserve segment and
|
|
178
|
+
word timing; older transcript JSON without `words` remains readable. Pass
|
|
179
|
+
`input_root=` to confine local input paths for untrusted callers. See
|
|
180
|
+
[the install guide](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
181
|
+
for ffmpeg and Windows ROCm setup.
|
|
182
|
+
|
|
183
|
+
MCP and HTTP transcript reads omit word timings by default to keep responses
|
|
184
|
+
small; set `include_words=true` on a JSON read to receive them. Saved files,
|
|
185
|
+
Python results, and durable job records still retain the source-language words,
|
|
186
|
+
including when segment text has been translated.
|
|
187
|
+
|
|
188
|
+
**AMD ROCm on native Windows:** do not use the generic command in an environment
|
|
189
|
+
with a working ROCm PyTorch install. Ordinary dependency resolution can replace
|
|
190
|
+
that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
191
|
+
to preserve it.
|
|
192
|
+
|
|
193
|
+
The same version's wheel and source archive are also on the
|
|
194
|
+
[GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
|
|
195
|
+
The release lists their SHA-256 hashes. For editable source development, see
|
|
196
|
+
[CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
|
|
197
|
+
|
|
149
198
|
## Usage
|
|
150
199
|
|
|
151
200
|
```bash
|
|
@@ -187,7 +236,7 @@ textflowkit export ./transcript.json --format vtt
|
|
|
187
236
|
## Use as an MCP server
|
|
188
237
|
|
|
189
238
|
```bash
|
|
190
|
-
pip install
|
|
239
|
+
python -m pip install 'textflowkit[mcp]'
|
|
191
240
|
textflowkit-mcp # stdio
|
|
192
241
|
textflowkit-mcp --transport http --port 8766 # Streamable HTTP
|
|
193
242
|
```
|
|
@@ -214,12 +263,12 @@ These checks are not end-to-end transcription runs driven by each harness:
|
|
|
214
263
|
There is also a protocol test that launches the server as a real subprocess and
|
|
215
264
|
speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
|
|
216
265
|
version negotiation are covered on every CI run (`tests/test_stdio_protocol.py`).
|
|
217
|
-
See [docs/adapters.md](docs/adapters.md) for per-harness configuration.
|
|
266
|
+
See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
|
|
218
267
|
|
|
219
268
|
## Use as an HTTP API
|
|
220
269
|
|
|
221
270
|
```bash
|
|
222
|
-
pip install
|
|
271
|
+
python -m pip install 'textflowkit[http]'
|
|
223
272
|
textflowkit-http --port 8767
|
|
224
273
|
```
|
|
225
274
|
|
|
@@ -227,7 +276,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
|
|
|
227
276
|
and defaults to localhost. The opt-in JSON HTTP production profile requires a
|
|
228
277
|
Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
|
|
229
278
|
limits; URL input additionally requires an SSRF-filtering egress proxy. See
|
|
230
|
-
[adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
|
|
279
|
+
[adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
|
|
231
280
|
|
|
232
281
|
## Durable, bounded, cancellable
|
|
233
282
|
|
|
@@ -237,7 +286,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
|
|
|
237
286
|
```
|
|
238
287
|
|
|
239
288
|
`cancel_job` stops a queued job immediately, or a running job at its next stage
|
|
240
|
-
boundary. See [docs/adapters.md](docs/adapters.md).
|
|
289
|
+
boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
|
|
241
290
|
|
|
242
291
|
## Long jobs never block
|
|
243
292
|
|
|
@@ -248,19 +297,19 @@ web frontend share the job contract without blocking a request.
|
|
|
248
297
|
|
|
249
298
|
## Status
|
|
250
299
|
|
|
251
|
-
**v0.1.
|
|
300
|
+
**v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
|
|
252
301
|
coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
|
|
253
302
|
The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
|
|
254
303
|
live transcription is not verified.
|
|
255
304
|
This does not imply that all 13 platforms or every harness workflow has been
|
|
256
|
-
tested end to end. See [docs/roadmap.md](docs/roadmap.md).
|
|
305
|
+
tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
|
|
257
306
|
|
|
258
307
|
## License
|
|
259
308
|
|
|
260
|
-
Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
|
|
309
|
+
Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
|
|
261
310
|
limitation of liability.
|
|
262
311
|
|
|
263
312
|
## Contributing
|
|
264
313
|
|
|
265
|
-
Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
|
|
314
|
+
Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
|
|
266
315
|
adapter.
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Cross-platform media transcription toolkit. **One core, one CLI, thin adapters.**
|
|
4
4
|
|
|
5
|
-
[Project landing page](https://
|
|
5
|
+
[Project landing page](https://www.textflowkit.org/) ·
|
|
6
|
+
[PyPI package](https://pypi.org/project/textflowkit/) ·
|
|
6
7
|
[GitHub releases](https://github.com/scottconverse/textflowkit/releases)
|
|
7
8
|
|
|
9
|
+
The [static site deployment](https://github.com/scottconverse/textflowkit/blob/main/docs/site-deployment.md) is hosted on Cloudflare
|
|
10
|
+
Pages. GitHub remains the source and CI host; the website does not run the
|
|
11
|
+
transcription engine.
|
|
12
|
+
|
|
8
13
|
Paste a URL or point at a file; get timestamped transcripts and subtitle files back.
|
|
9
14
|
Built as a reusable primitive for developers — designed to sit under multiple
|
|
10
15
|
products, AI harnesses, and agents.
|
|
@@ -15,12 +20,12 @@ products, AI harnesses, and agents.
|
|
|
15
20
|
>
|
|
16
21
|
> **This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND**, express or
|
|
17
22
|
> implied, including but not limited to the warranties of MERCHANTABILITY, FITNESS
|
|
18
|
-
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](LICENSE) (Apache-2.0,
|
|
23
|
+
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE) (Apache-2.0,
|
|
19
24
|
> §7–8) for the full disclaimer and limitation of liability.
|
|
20
25
|
>
|
|
21
26
|
> **You are responsible for what you transcribe.** textflowkit can fetch media from
|
|
22
27
|
> third-party platforms. Copyright, terms-of-service, and privacy obligations for any
|
|
23
|
-
> media you choose to process are **yours alone**. See [LEGAL.md](LEGAL.md).
|
|
28
|
+
> media you choose to process are **yours alone**. See [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md).
|
|
24
29
|
|
|
25
30
|
---
|
|
26
31
|
|
|
@@ -64,40 +69,79 @@ YouTube · TikTok · Facebook · Instagram · Vimeo · Twitch · Bilibili · Rum
|
|
|
64
69
|
Kick · Zoom · Medal · Loom · Dropbox — plus **direct media URLs and local files**.
|
|
65
70
|
|
|
66
71
|
All 13 are recognised through `yt-dlp`; only YouTube has an opt-in, maintained
|
|
67
|
-
[live end-to-end smoke](docs/release-checklist.md). It is run on a Windows
|
|
72
|
+
[live end-to-end smoke](https://github.com/scottconverse/textflowkit/blob/main/docs/release-checklist.md). It is run on a Windows
|
|
68
73
|
maintainer machine before a release, not on GitHub-hosted runners or every pull
|
|
69
74
|
request. Local files have also been transcribed live. The other
|
|
70
75
|
12 are not release-verified end to end, and some sources require cookies or
|
|
71
|
-
change their access rules frequently. See [docs/sources.md](docs/sources.md).
|
|
76
|
+
change their access rules frequently. See [docs/sources.md](https://github.com/scottconverse/textflowkit/blob/main/docs/sources.md).
|
|
72
77
|
|
|
73
78
|
## Install
|
|
74
79
|
|
|
75
80
|
Requires **Python ≥ 3.10** and **ffmpeg** on `PATH`.
|
|
76
81
|
|
|
77
82
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
pip install -e .
|
|
83
|
+
python -m pip install textflowkit
|
|
84
|
+
textflowkit doctor
|
|
81
85
|
```
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
For MCP or the JSON HTTP adapter, install the matching extra:
|
|
84
88
|
|
|
85
89
|
```bash
|
|
86
|
-
pip install
|
|
90
|
+
python -m pip install 'textflowkit[mcp]' # MCP server
|
|
91
|
+
python -m pip install 'textflowkit[http]' # JSON HTTP API
|
|
87
92
|
```
|
|
88
93
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
kept out of this file: the README is bundled into the wheel as its description,
|
|
92
|
-
so a hash written here would change the artifact it describes.)
|
|
93
|
-
Optional extras:
|
|
94
|
+
PDF/DOCX export is optional. The default wheel stays small; the `export` extra
|
|
95
|
+
installs `textflowkit-fonts` for offline multilingual PDF rendering:
|
|
94
96
|
|
|
95
97
|
```bash
|
|
96
|
-
pip install
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
python -m pip install 'textflowkit[export]'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Python API
|
|
102
|
+
|
|
103
|
+
The same pipeline used by the CLI and adapters is available to Python callers:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from textflowkit import transcribe
|
|
107
|
+
|
|
108
|
+
result = transcribe(
|
|
109
|
+
"meeting.mp4", # also accepts supported URLs
|
|
110
|
+
model="small",
|
|
111
|
+
formats=["json", "srt", "txt"],
|
|
112
|
+
output_dir="transcripts", # omit to return the transcript without writing files
|
|
113
|
+
)
|
|
114
|
+
print(result.transcript.text)
|
|
115
|
+
print(result.transcript.duration) # full media duration in seconds
|
|
116
|
+
print(result.outputs) # pathlib.Path objects for written files
|
|
117
|
+
for segment in result.transcript.segments:
|
|
118
|
+
print(segment.start, segment.end, segment.speaker, segment.text)
|
|
119
|
+
for word in segment.words:
|
|
120
|
+
print(" ", word.start, word.end, word.text)
|
|
99
121
|
```
|
|
100
122
|
|
|
123
|
+
`transcribe()` returns `TranscribeResult` with a canonical `Transcript` and
|
|
124
|
+
written output paths. `Transcript.to_dict()` / `.to_json()` preserve segment and
|
|
125
|
+
word timing; older transcript JSON without `words` remains readable. Pass
|
|
126
|
+
`input_root=` to confine local input paths for untrusted callers. See
|
|
127
|
+
[the install guide](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
128
|
+
for ffmpeg and Windows ROCm setup.
|
|
129
|
+
|
|
130
|
+
MCP and HTTP transcript reads omit word timings by default to keep responses
|
|
131
|
+
small; set `include_words=true` on a JSON read to receive them. Saved files,
|
|
132
|
+
Python results, and durable job records still retain the source-language words,
|
|
133
|
+
including when segment text has been translated.
|
|
134
|
+
|
|
135
|
+
**AMD ROCm on native Windows:** do not use the generic command in an environment
|
|
136
|
+
with a working ROCm PyTorch install. Ordinary dependency resolution can replace
|
|
137
|
+
that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
138
|
+
to preserve it.
|
|
139
|
+
|
|
140
|
+
The same version's wheel and source archive are also on the
|
|
141
|
+
[GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
|
|
142
|
+
The release lists their SHA-256 hashes. For editable source development, see
|
|
143
|
+
[CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
|
|
144
|
+
|
|
101
145
|
## Usage
|
|
102
146
|
|
|
103
147
|
```bash
|
|
@@ -139,7 +183,7 @@ textflowkit export ./transcript.json --format vtt
|
|
|
139
183
|
## Use as an MCP server
|
|
140
184
|
|
|
141
185
|
```bash
|
|
142
|
-
pip install
|
|
186
|
+
python -m pip install 'textflowkit[mcp]'
|
|
143
187
|
textflowkit-mcp # stdio
|
|
144
188
|
textflowkit-mcp --transport http --port 8766 # Streamable HTTP
|
|
145
189
|
```
|
|
@@ -166,12 +210,12 @@ These checks are not end-to-end transcription runs driven by each harness:
|
|
|
166
210
|
There is also a protocol test that launches the server as a real subprocess and
|
|
167
211
|
speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
|
|
168
212
|
version negotiation are covered on every CI run (`tests/test_stdio_protocol.py`).
|
|
169
|
-
See [docs/adapters.md](docs/adapters.md) for per-harness configuration.
|
|
213
|
+
See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
|
|
170
214
|
|
|
171
215
|
## Use as an HTTP API
|
|
172
216
|
|
|
173
217
|
```bash
|
|
174
|
-
pip install
|
|
218
|
+
python -m pip install 'textflowkit[http]'
|
|
175
219
|
textflowkit-http --port 8767
|
|
176
220
|
```
|
|
177
221
|
|
|
@@ -179,7 +223,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
|
|
|
179
223
|
and defaults to localhost. The opt-in JSON HTTP production profile requires a
|
|
180
224
|
Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
|
|
181
225
|
limits; URL input additionally requires an SSRF-filtering egress proxy. See
|
|
182
|
-
[adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
|
|
226
|
+
[adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
|
|
183
227
|
|
|
184
228
|
## Durable, bounded, cancellable
|
|
185
229
|
|
|
@@ -189,7 +233,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
|
|
|
189
233
|
```
|
|
190
234
|
|
|
191
235
|
`cancel_job` stops a queued job immediately, or a running job at its next stage
|
|
192
|
-
boundary. See [docs/adapters.md](docs/adapters.md).
|
|
236
|
+
boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
|
|
193
237
|
|
|
194
238
|
## Long jobs never block
|
|
195
239
|
|
|
@@ -200,19 +244,19 @@ web frontend share the job contract without blocking a request.
|
|
|
200
244
|
|
|
201
245
|
## Status
|
|
202
246
|
|
|
203
|
-
**v0.1.
|
|
247
|
+
**v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
|
|
204
248
|
coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
|
|
205
249
|
The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
|
|
206
250
|
live transcription is not verified.
|
|
207
251
|
This does not imply that all 13 platforms or every harness workflow has been
|
|
208
|
-
tested end to end. See [docs/roadmap.md](docs/roadmap.md).
|
|
252
|
+
tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
|
|
209
253
|
|
|
210
254
|
## License
|
|
211
255
|
|
|
212
|
-
Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
|
|
256
|
+
Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
|
|
213
257
|
limitation of liability.
|
|
214
258
|
|
|
215
259
|
## Contributing
|
|
216
260
|
|
|
217
|
-
Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
|
|
261
|
+
Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
|
|
218
262
|
adapter.
|
|
@@ -13,7 +13,7 @@ you expected.
|
|
|
13
13
|
|
|
14
14
|
| Version | Security-fix policy |
|
|
15
15
|
|---|---|
|
|
16
|
-
| Latest published release tag (
|
|
16
|
+
| Latest published release tag (see [GitHub releases](https://github.com/scottconverse/textflowkit/releases)) | Receives fixes through the next patch release |
|
|
17
17
|
| Earlier release tags, including earlier `0.1.x` tags | No backports |
|
|
18
18
|
| Unreleased `main` commits | Development only; not a supported release |
|
|
19
19
|
|