Skip to main content

notepipe

A programmable video-and-audio-to-Markdown pipeline — and a standalone CLI that works out of the box.

CI PyPI crates.io License: MIT

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.

![](<images/0001.jpg>)

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:

  1. Install the notepipe[ytdlp] extra:
    uv tool install "notepipe[ytdlp]"
    
  2. Add command = ["notepipe-source-ytdlp"] to [stages.download] in your config.toml (find the file with notepipe config path):
    [stages.download]
    type = "download"
    input = "source"
    output = "media"
    command = ["notepipe-source-ytdlp"]
    
  3. 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 ![](<images/0001.jpg>) 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 like transcript/speech or screenshots/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 by notepipe (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-resume starts fresh).
    • Clean cancellation. Ctrl-C (or SIGTERM on Unix) exits with code 130, terminates every child process tree notepipe spawned, and removes temporary downloaded media and extracted audio.

See docs/cli.md for the complete CLI integration contract and docs/design.md for architecture and design principles.


Documentation & project status

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)

Source distribution for notepipe 0.4.1
File Size Uploaded Provenance
notepipe-0.4.1.tar.gz 273.8 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for notepipe 0.4.1
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Security 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.

Select from 6 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page