A programmable video-and-audio-to-Markdown pipeline — and a standalone CLI that works out of the box.
Point notepipe at a lecture, talk, meeting or podcast and it writes a plain folder of Markdown, slide screenshots and
structured JSON: a summary at the top, followed by the spoken transcript grouped into paragraphs under the frame that
was on screen when each passage was spoken.
Look inside and almost nothing is fixed. Downloading, transcription, screenshot capture, timeline assembly, AI
rewriting, summarization and Markdown rendering are separate stages wired together in one TOML file. Every stage names
the file it reads and the file it writes, any command-line program can be a stage, any stage can stream its output to
stdout, and other programs can drive the binary directly over stdin and JSON lines. The core is a single Rust
binary whose only runtime dependency is ffmpeg — running on Linux, macOS, Windows, and Android in Termux.
export OPENAI_API_KEY=sk-…
notepipe lecture.mp4
Introduction-to-Compilers/
├── note.md # summary + screenshot-illustrated paragraphs
├── note.json # structured document (metadata, sections, timed paragraphs, raw text)
└── images/ # 0001.jpg, 0002.jpg, … captured when the screen changed and settled
## Overview
A compiler translates source code in stages, from characters to tokens, syntax trees and machine code.

We begin with lexical analysis. The scanner reads raw characters and groups them into tokens such as
identifiers, literals and operators.
Why notepipe
1. A transparent pipeline of real files
A run is a dependency graph of stages listed in pipeline. Each [stages.NAME] table declares what it reads (input),
what it writes (output) and whether its output is copied into the final note (publish):
source ─► download ─► media ─┬─► transcript ─► transcript.json ─┐
└─► screenshots ─► images/ ────────┴─► draft ─► draft.json
│
note.md ◄─ markdown ◄─ summary.md ◄─ summary ◄─ proofread.json ◄─ proofread
Every intermediate file lives in the recording's work directory (notepipe -v prints its path). You can open
transcript.json, inspect draft.json with jq, or compare draft.json against proofread.json to see every word a
model changed. Independent stages — such as transcript and screenshots — run at the same time, and the entire graph
is type-checked before any media or network work begins.
2. Almost nothing is hardcoded
Even proofread and summary are not built-in features: they are two type = "llm" stages in your config.toml with
plain-text prompts you can edit, duplicate or delete. You can rewire the graph to translate paragraphs, generate study
questions, run a Python or jq script between stages, replace the default Markdown assembly with your own layout, or
call pandoc to publish a .docx file alongside note.md.
3. Composes with standard Unix tools
Inside the pipeline, a type = "run" stage turns any command-line tool into a pipeline step, piping a file in on
stdin and capturing stdout (or passing paths via {input} and {output}) without invoking a shell. At the end of
the pipeline, setting publish = "-" on a stage streams its output to standard output so notepipe drops straight into
shell pipelines:
notepipe talk.mp4 | glow
4. Both a CLI tool and an embeddable engine
The CLI is also a strict programmatic interface. Applications and scripts can pass a complete TOML or JSON pipeline on
stdin (--config -), read real-time progress, token counts and logs as newline-delimited JSON (--json), and consume
the structured note.json output (schema 3) once the done event arrives.
5. One binary for Linux, macOS, Windows — and Termux on Android
The core binary compiles neural voice activity detection (earshot) and perceptual frame comparison (SSIM) directly into one native executable. It bundles no speech-recognition or language models, no Python runtime and no platform SDKs. Anything tied to a specific website, local inference runtime or non-OpenAI API lives outside the core in a standalone adapter process.
Install
notepipe requires ffmpeg (including ffprobe) on your PATH:
brew install ffmpeg on macOS, sudo apt install ffmpeg on Debian/Ubuntu, winget install ffmpeg on Windows, or
pkg install ffmpeg in Termux.
| Way to install | Command |
|---|---|
| uv | uv tool install notepipe (or uv tool install "notepipe[ytdlp]" with the URL adapter) |
| pipx / pip | pipx install notepipe or pip install notepipe |
| Cargo (pure Rust, no Python) | cargo install notepipe |
| Prebuilt binaries | GitHub Releases — Linux (x86_64, aarch64), macOS (arm64, x86_64), Windows (x86_64) |
| Android (Termux) | pkg install rust ffmpeg && cargo install notepipe |
Because uv tool install replaces the tool's environment each time it runs, list all the Python adapter extras you
want in a single command — for example uv tool install "notepipe[ytdlp,llama]".
Getting started
Local video and audio files
Out of the box, the default configuration processes local video and audio files using OpenAI (whisper-1 for speech
recognition and gpt-6-luna for proofreading and summarization) with the API key in OPENAI_API_KEY:
export OPENAI_API_KEY=sk-…
notepipe lecture.mp4 # writes ./<title>/note.md, note.json and images/
notepipe podcast.m4a -o ~/notes # audio-only input (no screenshots); write under ~/notes
notepipe seminar.mp4 --language ko # prefer Korean captions or pass `ko` to speech recognition
notepipe talk.mp4 --subtitle talk.srt # use an existing .srt or .vtt file as the transcript
notepipe lecture.mp4 --skip proofread,summary # no proofreading or summary for this run
On the first run, notepipe creates config.toml and prints its path. When sidecar subtitles sit next to a local file
(lecture.srt, lecture.vtt, lecture.en.srt, …), the transcript stage uses them automatically instead of calling
speech recognition.
Every provider key used by an active stage is checked before any work starts. To build a note with no API key at all, supply a subtitle file and skip the model stages:
notepipe talk.mp4 --subtitle talk.srt --skip proofread,summary
Online URLs (notepipe[ytdlp])
The core binary handles local files directly; fetching URLs is delegated to a download program configured on
[stages.download]. To run notepipe on YouTube or any other site supported by
yt-dlp:
- Install the
notepipe[ytdlp]extra:uv tool install "notepipe[ytdlp]"
- Add
command = ["notepipe-source-ytdlp"]to[stages.download]in yourconfig.toml(find the file withnotepipe config path):[stages.download] type = "download" input = "source" output = "media" command = ["notepipe-source-ytdlp"]
- Pass any URL on the command line:
notepipe https://youtu.be/VIDEO_ID
If you pass a URL without configuring a download command, notepipe stops before starting any work with:
A URL needs a download stage with a command, for example ["notepipe-source-ytdlp"] from notepipe[ytdlp].
Run notepipe doctor at any time to verify ffmpeg, ffprobe, your config.toml, configured adapter executables and
provider environment variables.
The pipeline & default configuration
notepipe reads config.toml from $XDG_CONFIG_HOME/notepipe/ when set, %APPDATA%\notepipe\ on Windows, and
~/.config/notepipe/ elsewhere:
notepipe config init # write the default config.toml (--force to overwrite)
notepipe config path # print the config file path
notepipe config show # print the effective configuration as TOML
In the generated file, settings at their built-in defaults are shown as # comments so every knob is visible in place,
and the prompts for proofread and summary are written out in full. Here is the exact default configuration with the
two multi-line prompts shortened to '''…''':
# Lines starting with # show the defaults.
# Every setting is described in https://github.com/3ae3ae/notepipe/blob/main/docs/configuration.md
pipeline = ["download", "transcript", "screenshots", "draft", "proofread", "summary", "markdown"]
# out = "."
[providers.openai]
base_url = "https://api.openai.com/v1"
api_key_env = "OPENAI_API_KEY"
# concurrency = 4
[stages.download]
type = "download"
input = "source"
output = "media"
[stages.transcript]
type = "transcript"
input = "media"
output = "transcript.json"
# language = "auto"
# sources = ["subtitles", "speech"]
[stages.transcript.subtitles]
# automatic = true
[stages.transcript.speech]
provider = "openai"
model = "whisper-1"
# api = "transcriptions"
# threshold = 0.5
# min_silence = 0.4
# max_segment = 20.0
[stages.screenshots]
type = "screenshots"
input = "media"
output = "images"
# mode = "stable"
# sensitivity = 0.85
# frame_interval = 1.0
# min_gap = 10.0
# settle = 0.8
[stages.draft]
type = "document"
input = ["transcript.json", "images"]
output = "draft.json"
[stages.proofread]
type = "llm"
input = "draft.json"
output = "proofread.json"
publish = "note.json"
provider = "openai"
model = "gpt-6-luna"
# images = false
# batch_size = 20
prompt = '''…'''
[stages.summary]
type = "llm"
input = "proofread.json"
output = "summary.md"
provider = "openai"
model = "gpt-6-luna"
# chunk_size = 25000
prompt = '''…'''
[stages.markdown]
type = "markdown"
input = ["summary.md", "proofread.json"]
output = "note.md"
publish = "note.md"
Stage types and file kinds
Stage names (draft, proofread, summary, …) and file names (transcript.json, draft.json, …) are arbitrary. What
a stage does is determined solely by its type, and each stage produces a typed artifact in the work folder that
downstream stages can read:
Stage type |
Reads (input) |
Writes (output) |
What it does |
|---|---|---|---|
download |
"source" |
media |
Resolves a local file (plus adjacent .srt/.vtt files) in place, or runs command to fetch a URL's media, metadata and captions. |
transcript |
media |
transcript (.json) |
Tries sources in order (subtitles, speech). For speech, detects voice segments locally with earshot, splits long stretches at quiet points, and transcribes via provider. |
screenshots |
media |
images (folder) |
Samples video frames via ffmpeg, compares them with SSIM (sensitivity, optional region), waits for animations to settle (mode = "stable"), and saves full-res JPEGs. |
document |
transcript + optional images |
document (.json) |
Aligns transcript lines under the active screenshot (splitting only at natural punctuation/space breaks) and merges fragments into paragraphs with script-aware word spacing. |
llm |
document, transcript or markdown |
document (.json) or markdown (.md) |
Sends the input to provider with prompt. An output ending in .json rewrites a document's paragraphs in batches (keeping original text in raw); ending in .md produces one Markdown response (using chunked map-reduce for long recordings). |
markdown |
one or more document / markdown files |
markdown (.md) |
Joins its inputs in order, rendering documents as  followed by their paragraphs, without adding front matter or headings. |
run |
any stage outputs | file (or produces kind) |
Runs an external command without a shell. Setting produces = "transcript" | "document" | "markdown" validates the output so later stages can read it. |
Every setting and CLI override is documented in docs/configuration.md.
Rewiring and extending the pipeline
Because stages communicate only through named files in the work folder, you can insert, reorder or replace stages
without touching notepipe's source code.
Add custom AI stages, CLI filters and export formats
pipeline = [
"download",
"transcript",
"screenshots",
"draft",
"glossary",
"proofread",
"translate",
"actions",
"summary",
"markdown",
"docx",
]
# 1. A non-LLM filter: reads draft.json on stdin, writes terms.json on stdout
[stages.glossary]
type = "run"
input = "draft.json"
output = "terms.json"
produces = "document"
command = ["python3", "fix-terms.py", "--glossary", "glossary.tsv"]
# 2. Proofread the glossary-fixed document, attaching each section's screenshot for visual spelling context
[stages.proofread]
type = "llm"
input = "terms.json"
output = "proofread.json"
provider = "openai"
model = "gpt-6-luna"
images = true
prompt = '''…'''
# 3. Rewrite each paragraph into Korean (.json output preserves timestamps, screenshots and `raw` text)
[stages.translate]
type = "llm"
input = "proofread.json"
output = "translated.json"
publish = "note.json"
provider = "openai"
model = "gpt-6-luna"
prompt = "Translate each item into Korean. Keep technical identifiers, code and LaTeX math unchanged."
# 4. Produce a standalone Markdown section (.md output answers once for the whole recording)
[stages.actions]
type = "llm"
input = "proofread.json"
output = "actions.md"
provider = "openai"
model = "gpt-6-luna"
prompt = "Extract decisions and action items as a Markdown checklist, noting owners and timestamps."
# 5. Assemble summary, action items and translated body in order
[stages.markdown]
type = "markdown"
input = ["summary.md", "actions.md", "translated.json"]
output = "note.md"
publish = "note.md"
# 6. Convert note.md to Word with pandoc and publish note.docx into the note folder
[stages.docx]
type = "run"
input = "note.md"
output = "note.docx"
publish = "note.docx"
command = ["pandoc", "{input}", "-o", "{output}"]
A run stage without {input} receives its single input file on stdin, and without {output} its stdout becomes
the stage's output file — so a complete document filter in Python is just:
#!/usr/bin/env python3
import json, sys
doc = json.load(sys.stdin)
for section in doc["sections"]:
for item in section["speech"]:
item["text"] = item["text"].replace("Kubernetis", "Kubernetes")
json.dump(doc, sys.stdout)
If a run stage on transcript.json adds custom fields to transcript events (such as "speaker": "Alice"), the
document stage preserves those fields and automatically starts a new paragraph whenever they change.
Switch cloud providers or local servers
Any OpenAI-compatible HTTP endpoint works as a provider. Define [providers.NAME] and reference provider = "NAME" on
the stages that should use it; API keys are read from the environment variable named in api_key_env and never stored
in config.toml.
[providers.groq]
base_url = "https://api.groq.com/openai/v1"
api_key_env = "GROQ_API_KEY"
[providers.ollama]
base_url = "http://localhost:11434/v1"
concurrency = 1
| Service | base_url |
Notes |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
Default (whisper-1, gpt-6-luna, …) |
| Anthropic | https://api.anthropic.com/v1 |
Any Claude model for llm stages |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai |
Any Gemini model |
| Groq | https://api.groq.com/openai/v1 |
e.g. whisper-large-v3-turbo for speech or chat models |
| Mistral | https://api.mistral.ai/v1 |
e.g. voxtral-mini-latest for speech or chat models |
| OpenRouter | https://openrouter.ai/api/v1 |
Any routed chat or multimodal model |
| Ollama / LM Studio / vLLM | http://localhost:11434/v1 (or your server's URL) |
Set concurrency = 1 for single-GPU local servers |
For audio-capable chat models, set api = "chat" under [stages.transcript.speech] to send speech segments to
/chat/completions instead of /audio/transcriptions.
Plug in local speech engines and other APIs (Adapters)
When a provider defines command instead of base_url, notepipe starts that program on demand with
--host 127.0.0.1 --port <free port>, waits for GET /health to return 200, routes requests to it across all stages
sharing that provider, and stops its process tree when the last stage finishes:
[providers.llama]
command = ["notepipe-asr-llama", "-hf", "ggml-org/Qwen3-ASR-1.7B-GGUF:Q8_0"]
concurrency = 1
[stages.transcript.speech]
provider = "llama"
Official adapters are published as independent packages and install as extras of notepipe:
| Extra | Executable | Kind | What it does |
|---|---|---|---|
ytdlp |
notepipe-source-ytdlp |
download | Downloads media, metadata and captions from any site yt-dlp supports; honors your yt-dlp config and forwards args after "--". |
llama |
notepipe-asr-llama |
provider | Local speech recognition on CPU or GPU via llama.cpp's llama-server. |
openvino |
notepipe-asr-openvino |
provider | Local speech recognition on an Intel NPU (default), CPU or GPU via OpenVINO GenAI. |
speech-swift |
notepipe-asr-speech-swift |
provider | Local speech recognition on Apple silicon (macOS 15+) using MLX or Core ML via speech-swift (built in CI; not yet verified on hardware). |
xai |
notepipe-asr-xai |
provider | Bridges transcription requests to xAI's speech-to-text API (XAI_API_KEY). |
meta |
notepipe-asr-meta |
provider | Bridges transcription requests to Meta's speech-to-text API (META_API_KEY). |
Writing your own provider, download or run program in any language takes only a few dozen lines of code. Full protocol
specifications and working Python stdlib templates are in
docs/adapters.md. Third-party adapters can be installed
alongside notepipe with uv tool install notepipe --with <package> or placed anywhere on PATH.
Using notepipe as an engine from other programs
Other tools, desktop UIs and automation pipelines integrate with notepipe by spawning the binary:
notepipe "$SOURCE" -o "$OUT" --config - --json < config.toml
- Configuration on
stdin(--config -): Pass the full pipeline as TOML or JSON without touching the user's~/.config/notepipe/config.toml. CLI flags (-o,--skip,--language,--subtitle, …) still apply on top. - Structured NDJSON events (
--json): Standard output emits one JSON object per line:{"type": "stage", "stage": "transcript", "status": "start" | "done"}(plus substeps liketranscript/speechorscreenshots/scan){"type": "progress", "stage": "…", "current": 4, "total": 18}{"type": "tokens", "stage": "proofread", "prompt": 1420, "completion": 980}{"type": "log", "level": "info" | "warn" | "error" | "debug", "message": "…"}{"type": "done", "note_dir": "…", "files": {"markdown": "…", "proofread": "…"}, "work_dir": "…", "warnings": []}{"type": "error", "message": "…"}
- Structured document (
note.json, schema 3):{ "schema": 3, "meta": { "title": "Introduction to Compilers", "author": "…", "duration": 2740.5, "source": "/abs/path/to/lecture.mp4", "seek_url": "https://…" }, "sections": [ { "t": 0.0, "end": 42.0, "image": "images/0001.jpg", "speech": [ {"start": 0.5, "end": 14.2, "text": "We begin with lexical analysis.", "raw": "uh we begin with lexical analysis"} ] } ] }
- Operational guarantees:
- Crash-safe publishing. A note is assembled in a staging directory and swapped into
<out>/<title>/whole. Failed or cancelled runs leave an existing note untouched; an interrupted swap is completed or rolled back on the next run. Folders not created bynotepipe(missing.notepipe.json) are never overwritten; distinct recordings sharing a title receive-2,-3, … suffixes. - Content-addressed caching and resume. Downloads, screenshots, speech segments and validated LLM responses are
cached in the source's work folder by the inputs that affect them. Editing the summary prompt sends only the summary's requests again;
an interrupted transcription resumes from the first unfinished segment (
--no-resumestarts fresh). - Clean cancellation.
Ctrl-C(orSIGTERMon Unix) exits with code130, terminates every child process treenotepipespawned, and removes temporary downloaded media and extracted audio.
- Crash-safe publishing. A note is assembled in a staging directory and swapped into
See docs/cli.md for the complete CLI integration contract and docs/design.md for architecture and design principles.
Documentation & project status
- Design & architecture
- Configuration reference
- CLI integration protocol &
note.jsonschema - Adapter contracts (provider, download & run programs)
- Changelog · Contributing · Security policy
notepipe is in 0.x. While the project is young, the configuration format, CLI options and note.json schema may
evolve between minor versions; all breaking and user-visible changes are recorded in
CHANGELOG.md.
Acknowledgements
notepipe began as a fork of course2md by
mizorewww, and its screenshot detection, subtitle handling and timeline alignment are
adapted from course2md's foundations. Thank you to mizorewww and all
course2md contributors — if you want a full desktop
application with a built-in notes library, check out course2md.
course2md's screenshot detection approach follows
yt-slide-mark by exopoiesis. notepipe also builds on
FFmpeg and earshot, and its official adapters wrap
yt-dlp, llama.cpp,
OpenVINO and
speech-swift.
License
Released under the MIT License, which retains course2md's
copyright notice alongside notepipe's own.
Metadata
Release files for notepipe 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| notepipe-0.4.1.tar.gz | 273.8 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| notepipe-0.4.1-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| notepipe-0.4.1-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| notepipe-0.4.1-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| notepipe-0.4.1-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| notepipe-0.4.1-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 15.7 MB
Release files / notepipe-0.4.1.tar.gz
| Download URL | notepipe-0.4.1.tar.gz |
|---|---|
| Size | 273.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a6b0a34ba6914494cedf881d2241695dd85b3a044c16365abaa77e64a7e9c21
|
|
BLAKE2b-256 checksum How to use checksums |
9f58b71224c51b0d229fbd682346bee8bd2a704b51124359102608cab9fb2400
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / notepipe-0.4.1-py3-none-win_amd64.whl
| Download URL | notepipe-0.4.1-py3-none-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2dfe2a9d2647bbe5a8ceac279135fc78a689a21c4009e3689f2f21a076df068e
|
|
BLAKE2b-256 checksum How to use checksums |
e3844379f4a1dcfd036f8ff474b362404aeb779104332add7db2f218cd4da6a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / notepipe-0.4.1-py3-none-manylinux_2_28_x86_64.whl
| Download URL | notepipe-0.4.1-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
64d490600e1e05820416eadf043e9752bdab3befbe8de104b79b8b6410ca9ab2
|
|
BLAKE2b-256 checksum How to use checksums |
c9804620efa575fab89b4daa1a2bd7b27d4f7500e8bb9150503056d8e7552ac2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / notepipe-0.4.1-py3-none-manylinux_2_28_aarch64.whl
| Download URL | notepipe-0.4.1-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
596c63f8b69247c56676f752c8d3f62ccb7617ce0e9b8d648871d8975f30d816
|
|
BLAKE2b-256 checksum How to use checksums |
22f98a401c88dd114d868cbcfae75451ed8463eaac9174f2b4eeb48338263d76
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / notepipe-0.4.1-py3-none-macosx_11_0_arm64.whl
| Download URL | notepipe-0.4.1-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
49bcc0ac69958567e2cdae26756f5caa1341212e3313d66c4364337c0c9024fb
|
|
BLAKE2b-256 checksum How to use checksums |
09249d84edab605e404fa037f3411233fbe961c85c6d8010d4466768dc0f6ab6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / notepipe-0.4.1-py3-none-macosx_10_12_x86_64.whl
| Download URL | notepipe-0.4.1-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
0ffadce8943aeff21e6110709c3eb03a30b80151e3a2ba9d82924434591263ea
|
|
BLAKE2b-256 checksum How to use checksums |
88c279ac28d3d9495de698ed852e02685737e691b9bdea19be8cfc7f4fdaba31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logSecurity for notepipe 0.4.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for notepipe-0.4.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.