notewise 1.0.0__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.
Files changed (102) hide show
  1. notewise-1.0.0/.gitignore +34 -0
  2. notewise-1.0.0/LICENSE +57 -0
  3. notewise-1.0.0/PKG-INFO +429 -0
  4. notewise-1.0.0/README.md +339 -0
  5. notewise-1.0.0/pyproject.toml +158 -0
  6. notewise-1.0.0/src/notewise/__init__.py +3 -0
  7. notewise-1.0.0/src/notewise/__main__.py +27 -0
  8. notewise-1.0.0/src/notewise/_constants.py +66 -0
  9. notewise-1.0.0/src/notewise/cli/__init__.py +1 -0
  10. notewise-1.0.0/src/notewise/cli/_admin.py +657 -0
  11. notewise-1.0.0/src/notewise/cli/_banner.py +68 -0
  12. notewise-1.0.0/src/notewise/cli/_batch_runner.py +330 -0
  13. notewise-1.0.0/src/notewise/cli/_context.py +123 -0
  14. notewise-1.0.0/src/notewise/cli/_display.py +318 -0
  15. notewise-1.0.0/src/notewise/cli/_formatters.py +160 -0
  16. notewise-1.0.0/src/notewise/cli/_runtime.py +87 -0
  17. notewise-1.0.0/src/notewise/cli/_single_runner.py +119 -0
  18. notewise-1.0.0/src/notewise/cli/_source_resolution.py +114 -0
  19. notewise-1.0.0/src/notewise/cli/_types.py +79 -0
  20. notewise-1.0.0/src/notewise/cli/app.py +867 -0
  21. notewise-1.0.0/src/notewise/config.py +295 -0
  22. notewise-1.0.0/src/notewise/domain/__init__.py +24 -0
  23. notewise-1.0.0/src/notewise/domain/events.py +48 -0
  24. notewise-1.0.0/src/notewise/domain/results.py +60 -0
  25. notewise-1.0.0/src/notewise/domain/youtube.py +57 -0
  26. notewise-1.0.0/src/notewise/errors.py +266 -0
  27. notewise-1.0.0/src/notewise/llm/__init__.py +6 -0
  28. notewise-1.0.0/src/notewise/llm/prompts/__init__.py +1 -0
  29. notewise-1.0.0/src/notewise/llm/prompts/chapter_notes.py +59 -0
  30. notewise-1.0.0/src/notewise/llm/prompts/quiz.py +82 -0
  31. notewise-1.0.0/src/notewise/llm/prompts/study_notes.py +112 -0
  32. notewise-1.0.0/src/notewise/llm/provider.py +327 -0
  33. notewise-1.0.0/src/notewise/logging.py +245 -0
  34. notewise-1.0.0/src/notewise/pipeline/__init__.py +19 -0
  35. notewise-1.0.0/src/notewise/pipeline/_artifacts.py +112 -0
  36. notewise-1.0.0/src/notewise/pipeline/_execution.py +439 -0
  37. notewise-1.0.0/src/notewise/pipeline/_helpers.py +64 -0
  38. notewise-1.0.0/src/notewise/pipeline/_limiter.py +82 -0
  39. notewise-1.0.0/src/notewise/pipeline/_state.py +24 -0
  40. notewise-1.0.0/src/notewise/pipeline/core.py +323 -0
  41. notewise-1.0.0/src/notewise/pipeline/generation.py +404 -0
  42. notewise-1.0.0/src/notewise/storage/__init__.py +29 -0
  43. notewise-1.0.0/src/notewise/storage/migrations.py +117 -0
  44. notewise-1.0.0/src/notewise/storage/models.py +97 -0
  45. notewise-1.0.0/src/notewise/storage/repository.py +400 -0
  46. notewise-1.0.0/src/notewise/storage/schemas.py +98 -0
  47. notewise-1.0.0/src/notewise/ui/__init__.py +1 -0
  48. notewise-1.0.0/src/notewise/ui/dashboard.py +347 -0
  49. notewise-1.0.0/src/notewise/ui/setup_wizard.py +650 -0
  50. notewise-1.0.0/src/notewise/updater.py +127 -0
  51. notewise-1.0.0/src/notewise/utils.py +71 -0
  52. notewise-1.0.0/src/notewise/youtube/__init__.py +19 -0
  53. notewise-1.0.0/src/notewise/youtube/_availability.py +56 -0
  54. notewise-1.0.0/src/notewise/youtube/_constants.py +37 -0
  55. notewise-1.0.0/src/notewise/youtube/extractor/__init__.py +14 -0
  56. notewise-1.0.0/src/notewise/youtube/extractor/_auth.py +244 -0
  57. notewise-1.0.0/src/notewise/youtube/extractor/_helpers.py +254 -0
  58. notewise-1.0.0/src/notewise/youtube/extractor/_parsers.py +282 -0
  59. notewise-1.0.0/src/notewise/youtube/extractor/_playlist.py +200 -0
  60. notewise-1.0.0/src/notewise/youtube/extractor/_transport.py +377 -0
  61. notewise-1.0.0/src/notewise/youtube/extractor/_video.py +314 -0
  62. notewise-1.0.0/src/notewise/youtube/extractor/async_client.py +68 -0
  63. notewise-1.0.0/src/notewise/youtube/extractor/client.py +201 -0
  64. notewise-1.0.0/src/notewise/youtube/metadata.py +187 -0
  65. notewise-1.0.0/src/notewise/youtube/parser.py +186 -0
  66. notewise-1.0.0/src/notewise/youtube/playlist.py +125 -0
  67. notewise-1.0.0/src/notewise/youtube/transcript.py +193 -0
  68. notewise-1.0.0/tests/conftest.py +148 -0
  69. notewise-1.0.0/tests/e2e/test_public_smoke.py +82 -0
  70. notewise-1.0.0/tests/integration/cli/test_cli.py +2083 -0
  71. notewise-1.0.0/tests/integration/pipeline/test_core_pipeline.py +1979 -0
  72. notewise-1.0.0/tests/integration/storage/test_cache_repository_lifecycle.py +306 -0
  73. notewise-1.0.0/tests/integration/storage/test_db.py +443 -0
  74. notewise-1.0.0/tests/integration/storage/test_repository.py +201 -0
  75. notewise-1.0.0/tests/unit/cli/test_admin.py +709 -0
  76. notewise-1.0.0/tests/unit/cli/test_app_helpers.py +18 -0
  77. notewise-1.0.0/tests/unit/cli/test_banner.py +47 -0
  78. notewise-1.0.0/tests/unit/cli/test_display.py +390 -0
  79. notewise-1.0.0/tests/unit/cli/test_formatters.py +151 -0
  80. notewise-1.0.0/tests/unit/cli/test_runtime.py +83 -0
  81. notewise-1.0.0/tests/unit/cli/test_source_resolution.py +108 -0
  82. notewise-1.0.0/tests/unit/cli/test_updater.py +66 -0
  83. notewise-1.0.0/tests/unit/config/test_config.py +238 -0
  84. notewise-1.0.0/tests/unit/config/test_config_helpers.py +39 -0
  85. notewise-1.0.0/tests/unit/errors/test_exceptions.py +161 -0
  86. notewise-1.0.0/tests/unit/llm/test_generator.py +366 -0
  87. notewise-1.0.0/tests/unit/llm/test_providers.py +371 -0
  88. notewise-1.0.0/tests/unit/pipeline/test_core.py +245 -0
  89. notewise-1.0.0/tests/unit/storage/test_isolation.py +21 -0
  90. notewise-1.0.0/tests/unit/storage/test_migrations.py +56 -0
  91. notewise-1.0.0/tests/unit/test_logging.py +103 -0
  92. notewise-1.0.0/tests/unit/test_main.py +47 -0
  93. notewise-1.0.0/tests/unit/ui/test_setup_wizard.py +558 -0
  94. notewise-1.0.0/tests/unit/ui/test_ui.py +238 -0
  95. notewise-1.0.0/tests/unit/utils/test_filenames.py +83 -0
  96. notewise-1.0.0/tests/unit/utils/test_iterables.py +23 -0
  97. notewise-1.0.0/tests/unit/youtube/test_extractor_client.py +1141 -0
  98. notewise-1.0.0/tests/unit/youtube/test_extractor_transcripts.py +194 -0
  99. notewise-1.0.0/tests/unit/youtube/test_metadata.py +323 -0
  100. notewise-1.0.0/tests/unit/youtube/test_parser.py +138 -0
  101. notewise-1.0.0/tests/unit/youtube/test_playlist.py +130 -0
  102. notewise-1.0.0/tests/unit/youtube/test_transcript.py +316 -0
@@ -0,0 +1,34 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ .env
12
+ .opencode/
13
+ nul
14
+ .coverage
15
+ drafts/
16
+ .omc
17
+ .claude
18
+
19
+ # Generated content
20
+ src/yt_study/output/
21
+ coverage.xml
22
+ htmlcov/
23
+ dummy_path
24
+ codex*
25
+ .codex*
26
+ *temp*
27
+ *tmp*
28
+ *.log
29
+ *codex*
30
+ cookies.txt
31
+ .context-mem
32
+ output
33
+ *_cache
34
+ urls.txt
notewise-1.0.0/LICENSE ADDED
@@ -0,0 +1,57 @@
1
+ MIT License with Attribution Requirement
2
+
3
+ Copyright (c) 2026 whoisjayd (https://github.com/whoisjayd)
4
+ Repository: https://github.com/whoisjayd/notewise
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ 1. ATTRIBUTION REQUIREMENT — If you use, distribute, embed, or build upon
14
+ this Software (or any substantial portion of it) in a project, product,
15
+ service, publication, or derivative work, you MUST:
16
+
17
+ a) Retain this copyright notice and license in all copies or substantial
18
+ portions of the Software.
19
+
20
+ b) Provide clear, visible credit to the original project in your
21
+ documentation, README, about page, or wherever attribution is
22
+ customarily given. The credit must include: - The project name: NoteWise - The author: whoisjayd - A direct link to: https://github.com/whoisjayd/notewise
23
+
24
+ Example attribution (adapt the format to your context):
25
+
26
+ "Powered by NoteWise (https://github.com/whoisjayd/notewise)
27
+ by whoisjayd, used under the MIT License with Attribution."
28
+
29
+ c) Not misrepresent the origin of the Software or claim authorship
30
+ of the original work.
31
+
32
+ 2. The above copyright notice, this permission notice, and the attribution
33
+ requirement shall be included in all copies or substantial portions of
34
+ the Software.
35
+
36
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
39
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
42
+ SOFTWARE.
43
+
44
+ ───────────────────────────────────────────────────────────────────────────────
45
+
46
+ SUMMARY (not a substitute for the full license above):
47
+
48
+ ✅ Free to use personally, commercially, and in open-source projects
49
+ ✅ Free to modify and distribute
50
+ ✅ Free to sublicense
51
+ ✅ Free for private/internal, non-distributed use
52
+ ❗ Must credit NoteWise + link to repo when distributing or publishing
53
+ ❗ Must include this license in copies or substantial portions
54
+ ❌ Cannot claim original authorship
55
+ ❌ No warranty provided
56
+
57
+ ───────────────────────────────────────────────────────────────────────────────
@@ -0,0 +1,429 @@
1
+ Metadata-Version: 2.4
2
+ Name: notewise
3
+ Version: 1.0.0
4
+ Summary: Convert YouTube videos into AI-powered study notes with chapter support
5
+ Project-URL: Homepage, https://github.com/whoisjayd/notewise
6
+ Project-URL: Repository, https://github.com/whoisjayd/notewise
7
+ Project-URL: Issues, https://github.com/whoisjayd/notewise/issues
8
+ Project-URL: Documentation, https://github.com/whoisjayd/notewise
9
+ Author-email: whoisjayd <contactjaydeepsolanki@gmail.com>
10
+ License: MIT License with Attribution Requirement
11
+
12
+ Copyright (c) 2026 whoisjayd (https://github.com/whoisjayd)
13
+ Repository: https://github.com/whoisjayd/notewise
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ 1. ATTRIBUTION REQUIREMENT — If you use, distribute, embed, or build upon
23
+ this Software (or any substantial portion of it) in a project, product,
24
+ service, publication, or derivative work, you MUST:
25
+
26
+ a) Retain this copyright notice and license in all copies or substantial
27
+ portions of the Software.
28
+
29
+ b) Provide clear, visible credit to the original project in your
30
+ documentation, README, about page, or wherever attribution is
31
+ customarily given. The credit must include: - The project name: NoteWise - The author: whoisjayd - A direct link to: https://github.com/whoisjayd/notewise
32
+
33
+ Example attribution (adapt the format to your context):
34
+
35
+ "Powered by NoteWise (https://github.com/whoisjayd/notewise)
36
+ by whoisjayd, used under the MIT License with Attribution."
37
+
38
+ c) Not misrepresent the origin of the Software or claim authorship
39
+ of the original work.
40
+
41
+ 2. The above copyright notice, this permission notice, and the attribution
42
+ requirement shall be included in all copies or substantial portions of
43
+ the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
51
+ SOFTWARE.
52
+
53
+ ───────────────────────────────────────────────────────────────────────────────
54
+
55
+ SUMMARY (not a substitute for the full license above):
56
+
57
+ ✅ Free to use personally, commercially, and in open-source projects
58
+ ✅ Free to modify and distribute
59
+ ✅ Free to sublicense
60
+ ✅ Free for private/internal, non-distributed use
61
+ ❗ Must credit NoteWise + link to repo when distributing or publishing
62
+ ❗ Must include this license in copies or substantial portions
63
+ ❌ Cannot claim original authorship
64
+ ❌ No warranty provided
65
+
66
+ ───────────────────────────────────────────────────────────────────────────────
67
+ License-File: LICENSE
68
+ Keywords: ai,education,llm,notes,study,transcript,youtube
69
+ Classifier: Development Status :: 4 - Beta
70
+ Classifier: Intended Audience :: Education
71
+ Classifier: Intended Audience :: End Users/Desktop
72
+ Classifier: License :: Other/Proprietary License
73
+ Classifier: Programming Language :: Python :: 3
74
+ Classifier: Programming Language :: Python :: 3.10
75
+ Classifier: Programming Language :: Python :: 3.11
76
+ Classifier: Programming Language :: Python :: 3.12
77
+ Classifier: Programming Language :: Python :: 3.13
78
+ Classifier: Topic :: Education
79
+ Classifier: Topic :: Multimedia :: Video
80
+ Requires-Python: >=3.10
81
+ Requires-Dist: aiolimiter>=1.2.1
82
+ Requires-Dist: litellm>=1.81.1
83
+ Requires-Dist: pydantic-settings>=2.6.0
84
+ Requires-Dist: pydantic>=2.9.0
85
+ Requires-Dist: rich>=13.9.4
86
+ Requires-Dist: sqlalchemy>=2.0.0
87
+ Requires-Dist: structlog>=24.4.0
88
+ Requires-Dist: typer>=0.21.1
89
+ Description-Content-Type: text/markdown
90
+
91
+ <div align="center">
92
+
93
+ # 🎓 NoteWise
94
+
95
+ **Convert YouTube videos and playlists into comprehensive AI-powered study notes — from your terminal.**
96
+
97
+ <br />
98
+
99
+ <img src="https://img.shields.io/badge/version-1.0.0-4f86f7?style=flat-square" alt="version" /> <img src="https://img.shields.io/badge/status-stable-22c55e?style=flat-square" alt="status" /> <img src="https://img.shields.io/badge/license-MIT--Attribution-10b981?style=flat-square" alt="license" /> <img src="https://img.shields.io/badge/python-3.10%20|%203.11%20|%203.12%20|%203.13-3776AB?style=flat-square&logo=python&logoColor=white" alt="python versions" /> <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json&style=flat-square" alt="ruff" /> <img src="https://img.shields.io/badge/type--checked-ty-7c3aed?style=flat-square" alt="ty" /> <img src="https://img.shields.io/github/actions/workflow/status/whoisjayd/notewise/ci-main.yml?branch=main&style=flat-square&label=CI&logo=github" alt="CI" /> <img src="https://img.shields.io/codecov/c/github/whoisjayd/notewise?style=flat-square&logo=codecov&logoColor=white&label=coverage" alt="coverage" /> <img src="https://img.shields.io/badge/coverage%20gate-%E2%89%A590%25-22c55e?style=flat-square" alt="coverage gate" /> <img src="https://img.shields.io/badge/LiteLLM-powered-ff6b35?style=flat-square" alt="litellm" /> <img src="https://img.shields.io/badge/packaged%20with-uv-de5fe9?style=flat-square" alt="uv" /> <img src="https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white" alt="docker" />
100
+
101
+ <br /><br />
102
+
103
+ [**Why NoteWise?**](#-why-notewise) · [**Quick Start**](#-quick-start) · [**Features**](#-features) · [**Installation**](#-installation) · [**Configuration**](#configuration) · [**Providers**](#-supported-providers) · [**Contributing**](CONTRIBUTING.md)
104
+
105
+ </div>
106
+
107
+ ## 💡 Why NoteWise?
108
+
109
+ YouTube has become one of the richest learning platforms on the planet — university lectures, conference talks, technical deep-dives, language lessons, and entire courses are all freely available. But video is a passive medium. You watch, you nod, and two days later the details are gone.
110
+
111
+ **NoteWise was built to fix that gap.**
112
+
113
+ The idea is simple: your time watching a video is valuable. The notes that _should_ come from it — the structured, searchable, reviewable kind — shouldn't require an extra hour of your day. NoteWise automates exactly that step. Point it at any YouTube URL and walk away with Markdown study notes that are deeper and more comprehensive than most people would write by hand.
114
+
115
+ **Where it shines:**
116
+
117
+ - 📚 **Students** catching up on lecture recordings or supplementing textbooks with YouTube explanations
118
+ - 🧑‍💻 **Developers** staying on top of conference talks, tutorials, and technical deep-dives without watching at 3x speed
119
+ - 🌍 **Language learners** extracting structured notes from native-language content
120
+ - 📋 **Researchers** quickly distilling hours of talks into organized, searchable reference material
121
+ - 🏢 **Teams** turning internal video presentations into shareable written documentation
122
+
123
+ The output isn't a transcript summary. It's structured, hierarchical Markdown — with headers, sub-topics, definitions, examples, and every concept explained in depth. Chapter-aware videos get per-chapter notes. Long courses produce an organized note file per session. Everything lands in your filesystem: portable, searchable, and permanently yours.
124
+
125
+ ## ✨ Features
126
+
127
+ | | |
128
+ | -------------------------------------- | ------------------------------------------------------------------------------------------ |
129
+ | 📹 **Single Video, Playlists & Batch** | Process one video, an entire playlist, or a `.txt` file of URLs in a single command |
130
+ | 🤖 **Multi-Provider LLM Support** | Works with Gemini, OpenAI, Anthropic, Groq, Mistral, Cohere, DeepSeek, and xAI via LiteLLM |
131
+ | 🗂️ **Chapter-Aware Notes** | Automatically detects video chapters and generates separate, structured notes per chapter |
132
+ | ❓ **Quiz Generation** | Optionally produce a ready-to-use multiple-choice quiz alongside each study guide |
133
+ | 📝 **Transcript Export** | Export raw transcripts as plain `.txt` or timestamped `.json` |
134
+ | ⚡ **Concurrent Processing** | Configurable concurrency — process multiple videos and chapters simultaneously |
135
+ | 💾 **Local SQLite Cache** | Transcripts and run stats are cached; skip already-processed videos automatically |
136
+ | 🖥️ **Rich Live Dashboard** | Real-time progress UI with a `--no-ui` plain-output mode for CI/cron |
137
+ | 🐳 **Docker Ready** | Minimal two-stage Docker image for reproducible, stateless runs |
138
+ | 🔒 **Private Video Support** | Pass a Netscape-format cookie file to process age-gated or login-required videos |
139
+
140
+ ## 🚀 Quick Start
141
+
142
+ ### 1 · Install
143
+
144
+ ```bash
145
+ uv tool install notewise
146
+ ```
147
+
148
+ Or with [pipx](https://pipx.pypa.io/stable/):
149
+
150
+ ```bash
151
+ pipx install notewise
152
+ ```
153
+
154
+ For standalone binaries with checksum verification and PATH setup:
155
+
156
+ ```bash
157
+ curl -fsSL https://github.com/whoisjayd/notewise/releases/latest/download/install.sh | sh
158
+ ```
159
+
160
+ ### 2 · Configure
161
+
162
+ Run the interactive setup wizard once to store your LLM API key:
163
+
164
+ ```bash
165
+ notewise setup
166
+ ```
167
+
168
+ This creates `~/.notewise/config.env`. The default model is **Gemini 2.5 Flash** — grab a free key at [aistudio.google.com](https://aistudio.google.com/app/apikey).
169
+
170
+ ### 3 · Generate Study Notes
171
+
172
+ ```bash
173
+ # Single video
174
+ notewise process "https://youtube.com/watch?v=VIDEO_ID"
175
+
176
+ # Full playlist
177
+ notewise process "https://youtube.com/playlist?list=PLAYLIST_ID"
178
+
179
+ # Batch file (one URL per line)
180
+ notewise process my-course-urls.txt -o ./course-notes
181
+ ```
182
+
183
+ Notes are written as Markdown files in `./output/` (or your configured directory).
184
+
185
+ ## 📦 Installation
186
+
187
+ ### Requirements
188
+
189
+ - Python **3.10** or newer (3.10, 3.11, 3.12, and 3.13 are tested in CI)
190
+ - An API key for at least one [supported LLM provider](#-supported-providers)
191
+
192
+ ### uv (recommended)
193
+
194
+ ```bash
195
+ uv tool install notewise
196
+ ```
197
+
198
+ ### pipx
199
+
200
+ ```bash
201
+ pipx install notewise
202
+ ```
203
+
204
+ ### pip
205
+
206
+ ```bash
207
+ pip install notewise
208
+ ```
209
+
210
+ `uv tool install` and `pipx install` are the best choices when you want `notewise` available from anywhere on your system `PATH`. Plain `pip install` installs the CLI into the active Python environment.
211
+
212
+ ### Standalone Binary Installer
213
+
214
+ ```bash
215
+ curl -fsSL https://github.com/whoisjayd/notewise/releases/latest/download/install.sh | sh
216
+ ```
217
+
218
+ On Windows:
219
+
220
+ ```powershell
221
+ irm https://github.com/whoisjayd/notewise/releases/latest/download/install.ps1 | iex
222
+ ```
223
+
224
+ Both installer scripts verify `SHA256SUMS.txt`, install the release binary, and update your user-level `PATH`.
225
+
226
+ ### Docker
227
+
228
+ ```bash
229
+ docker pull ghcr.io/whoisjayd/notewise:latest
230
+
231
+ docker run --rm \
232
+ -e GEMINI_API_KEY="your_key" \
233
+ -v "$(pwd)/output:/output" \
234
+ ghcr.io/whoisjayd/notewise:latest \
235
+ process "https://youtube.com/watch?v=VIDEO_ID"
236
+ ```
237
+
238
+ ### Development Install
239
+
240
+ ```bash
241
+ git clone https://github.com/whoisjayd/notewise
242
+ cd notewise
243
+ uv sync --dev
244
+ ```
245
+
246
+ ### Updating
247
+
248
+ Check for a newer release and print the recommended upgrade command for your install:
249
+
250
+ ```bash
251
+ notewise update
252
+ ```
253
+
254
+ <a id="configuration"></a>
255
+
256
+ ## ⚙️ Configuration
257
+
258
+ notewise reads configuration from `~/.notewise/config.env` (created by `notewise setup`).
259
+ Environment variables always take precedence over the config file.
260
+
261
+ ### Key Settings
262
+
263
+ | Key | Default | Description |
264
+ | ----------------------------- | ------------------------- | ---------------------------------- |
265
+ | `DEFAULT_MODEL` | `gemini/gemini-2.5-flash` | LiteLLM-format model string |
266
+ | `OUTPUT_DIR` | `./output` | Where study notes are saved |
267
+ | `TEMPERATURE` | `0.7` | LLM sampling temperature (0.0–1.0) |
268
+ | `MAX_TOKENS` | _(model default)_ | Max tokens per LLM response |
269
+ | `MAX_CONCURRENT_VIDEOS` | `5` | Parallel video processing limit |
270
+ | `YOUTUBE_REQUESTS_PER_MINUTE` | `10` | YouTube request rate limit |
271
+ | `YOUTUBE_COOKIE_FILE` | _(none)_ | Path to Netscape cookies file |
272
+
273
+ Override any setting per-run via CLI flags — run `notewise process --help` for all options.
274
+
275
+ ### State Directory
276
+
277
+ All persistent state (config, cache, logs) lives in `~/.notewise/` by default. Override with:
278
+
279
+ ```bash
280
+ export NOTEWISE_HOME=/path/to/custom/dir
281
+ ```
282
+
283
+ ## 🤖 Supported Providers
284
+
285
+ notewise uses [LiteLLM](https://github.com/BerriAI/litellm) — any model string LiteLLM supports works here.
286
+
287
+ | Provider | Config Key | Example Model String |
288
+ | ------------- | ------------------- | ------------------------------ |
289
+ | Google Gemini | `GEMINI_API_KEY` | `gemini/gemini-2.5-flash` |
290
+ | OpenAI | `OPENAI_API_KEY` | `gpt-4o` |
291
+ | Anthropic | `ANTHROPIC_API_KEY` | `claude-3-5-sonnet-20241022` |
292
+ | Groq | `GROQ_API_KEY` | `groq/llama3-70b-8192` |
293
+ | xAI | `XAI_API_KEY` | `xai/grok-2` |
294
+ | Mistral | `MISTRAL_API_KEY` | `mistral/mistral-large-latest` |
295
+ | Cohere | `COHERE_API_KEY` | `command-r-plus` |
296
+ | DeepSeek | `DEEPSEEK_API_KEY` | `deepseek/deepseek-chat` |
297
+
298
+ Use any provider with `--model`:
299
+
300
+ ```bash
301
+ notewise process "URL" --model claude-3-5-sonnet-20241022
302
+ ```
303
+
304
+ ## 🖥️ CLI Reference
305
+
306
+ ```
307
+ notewise [COMMAND] [OPTIONS]
308
+ ```
309
+
310
+ | Command | Description |
311
+ | --------------- | ---------------------------------------------------------- |
312
+ | `process <url>` | Generate study notes from a video, playlist, or batch file |
313
+ | `setup` | Run the interactive configuration wizard |
314
+ | `config` | Display the current configuration (secrets masked) |
315
+ | `stats` | Show aggregate processing statistics |
316
+ | `history` | List recently processed videos |
317
+ | `info [url]` | Inspect a YouTube source or show runtime info |
318
+ | `doctor` | Run a health check on config, cache, and logs |
319
+ | `edit-config` | Open the config file in your editor |
320
+ | `cache` | Manage the local SQLite cache |
321
+ | `logs` | Inspect and manage session log files |
322
+ | `update` | Check for a newer release and print upgrade commands |
323
+ | `version` | Print the installed version |
324
+
325
+ ### `process` Options
326
+
327
+ ```
328
+ notewise process URL [OPTIONS]
329
+
330
+ -m, --model TEXT LLM model (overrides config)
331
+ -o, --output PATH Output directory (overrides config)
332
+ -l, --language TEXT Preferred transcript language (repeatable)
333
+ -t, --temperature FLOAT LLM temperature 0.0–1.0
334
+ -k, --max-tokens INT Max tokens per LLM response
335
+ -F, --force Re-process already-processed videos
336
+ --no-ui Plain stdout output (CI/cron friendly)
337
+ --quiz Also generate a multiple-choice quiz
338
+ --export-transcript Export raw transcript: txt or json
339
+ --cookie-file PATH Netscape cookies file for private videos
340
+ ```
341
+
342
+ ## 📂 Output Structure
343
+
344
+ ```
345
+ output/
346
+ ├── Video Title/
347
+ │ ├── study_notes.md # Full study notes
348
+ │ ├── quiz.md # (optional, --quiz)
349
+ │ └── transcript.txt # (optional, --export-transcript txt)
350
+ └── Another Video Title/
351
+ └── study_notes.md
352
+ ```
353
+
354
+ For chapter-aware videos (>1 hour with chapters), notes are split by chapter:
355
+
356
+ ```
357
+ output/
358
+ └── Long Course Title/
359
+ ├── Chapter 01 - Introduction.md
360
+ ├── Chapter 02 - Core Concepts.md
361
+ └── ...
362
+ ```
363
+
364
+ ## 🐳 Docker
365
+
366
+ The image is published to GHCR on every release:
367
+
368
+ ```bash
369
+ docker run --rm \
370
+ -e GEMINI_API_KEY="your_key" \
371
+ -v "$(pwd)/output:/output" \
372
+ ghcr.io/whoisjayd/notewise:latest \
373
+ process "https://youtube.com/watch?v=VIDEO_ID" --no-ui
374
+ ```
375
+
376
+ Mount `/output` to access generated files on the host. The container runs as a non-root user (uid 1001).
377
+
378
+ ## 🛠️ Development
379
+
380
+ ```bash
381
+ # Clone & install
382
+ git clone https://github.com/whoisjayd/notewise
383
+ cd notewise
384
+ uv sync --dev
385
+
386
+ # Run tests
387
+ make test
388
+
389
+ # Lint, format, type-check
390
+ make quality
391
+
392
+ # Full CI pipeline locally
393
+ make ci
394
+ ```
395
+
396
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the complete contributor guide.
397
+
398
+ ## 📋 Changelog
399
+
400
+ See [GitHub Releases](https://github.com/whoisjayd/notewise/releases) for the full history.
401
+
402
+ ## 📄 License
403
+
404
+ [MIT with Attribution](LICENSE) — free to use, modify, and distribute.
405
+ If you use notewise in a project or build on top of it, you are required to include credit and a link back to this repository. See [LICENSE](LICENSE) for the full terms.
406
+
407
+ ## 🤝 Contributing
408
+
409
+ Contributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) to get started.
410
+
411
+ Found a bug? [Open an issue](https://github.com/whoisjayd/notewise/issues/new/choose).
412
+ Have a security concern? See [SECURITY.md](SECURITY.md).
413
+
414
+ ## 🙏 Thank You
415
+
416
+ notewise is built on top of a great open-source ecosystem, and this project is deeply grateful to the maintainers behind those tools and libraries.
417
+
418
+ See [GRATITUDE.md](GRATITUDE.md) for full acknowledgements.
419
+
420
+ And most importantly — **thank you to everyone who has used notewise, filed issues, suggested features, or contributed code.** Every star, bug report, and PR makes this better.
421
+
422
+ If notewise helped you study smarter, learn faster, or just saved you some time — that's exactly why it was built. ⭐
423
+
424
+ <div align="center">
425
+ <br />
426
+ <sub>Built with ❤️ by <a href="https://github.com/whoisjayd">whoisjayd</a></sub>
427
+ <br />
428
+ <sub>If you use notewise, please give credit — it takes two seconds and means a lot.</sub>
429
+ </div>