wirenote 0.1.0__py3-none-any.whl

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 (60) hide show
  1. wirenote/__init__.py +3 -0
  2. wirenote/calendar/__init__.py +2 -0
  3. wirenote/calendar/ics.py +236 -0
  4. wirenote/capture/__init__.py +2 -0
  5. wirenote/capture/recorder.py +304 -0
  6. wirenote/capture/wav.py +58 -0
  7. wirenote/cli.py +262 -0
  8. wirenote/config/__init__.py +2 -0
  9. wirenote/config/apps.py +158 -0
  10. wirenote/config/migrate.py +130 -0
  11. wirenote/config/perms.py +61 -0
  12. wirenote/config/secrets.py +98 -0
  13. wirenote/config/settings.py +176 -0
  14. wirenote/config/vocabulary.py +32 -0
  15. wirenote/data/wirenote-ui.service +15 -0
  16. wirenote/data/wirenote.desktop +10 -0
  17. wirenote/data/wirenote.service +15 -0
  18. wirenote/detector/__init__.py +2 -0
  19. wirenote/detector/core.py +115 -0
  20. wirenote/detector/daemon.py +743 -0
  21. wirenote/detector/graph.py +102 -0
  22. wirenote/detector/identity.py +205 -0
  23. wirenote/detector/streams.py +69 -0
  24. wirenote/detector/tracker.py +304 -0
  25. wirenote/net/__init__.py +2 -0
  26. wirenote/net/peer.py +101 -0
  27. wirenote/notify/__init__.py +2 -0
  28. wirenote/notify/clipboard.py +43 -0
  29. wirenote/notify/dbus.py +89 -0
  30. wirenote/process/__init__.py +2 -0
  31. wirenote/process/jobs.py +122 -0
  32. wirenote/process/merge.py +87 -0
  33. wirenote/process/models.py +57 -0
  34. wirenote/process/note.py +124 -0
  35. wirenote/process/speakers.py +295 -0
  36. wirenote/process/summarize.py +287 -0
  37. wirenote/process/transcribe.py +97 -0
  38. wirenote/process/worker.py +229 -0
  39. wirenote/tools/__init__.py +2 -0
  40. wirenote/tools/dump_streams.py +595 -0
  41. wirenote/tools/install.py +140 -0
  42. wirenote/tools/setup.py +338 -0
  43. wirenote/ui/__init__.py +2 -0
  44. wirenote/ui/data.py +783 -0
  45. wirenote/ui/launch.py +88 -0
  46. wirenote/ui/server.py +423 -0
  47. wirenote/ui/static/app.css +907 -0
  48. wirenote/ui/static/app.js +1267 -0
  49. wirenote/ui/static/fonts/OFL.txt +93 -0
  50. wirenote/ui/static/fonts/inter-latin-ext.woff2 +0 -0
  51. wirenote/ui/static/fonts/inter-latin.woff2 +0 -0
  52. wirenote/ui/static/icon.svg +1 -0
  53. wirenote/ui/static/icons.svg +31 -0
  54. wirenote/ui/static/index.html +57 -0
  55. wirenote/ui/static/login.html +19 -0
  56. wirenote-0.1.0.dist-info/METADATA +106 -0
  57. wirenote-0.1.0.dist-info/RECORD +60 -0
  58. wirenote-0.1.0.dist-info/WHEEL +4 -0
  59. wirenote-0.1.0.dist-info/entry_points.txt +2 -0
  60. wirenote-0.1.0.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,93 @@
1
+ Google Inc.
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#1f8a5b"/><rect x="8" y="12" width="3" height="8" rx="1.5" fill="#fff"/><rect x="14.5" y="8" width="3" height="16" rx="1.5" fill="#fff"/><rect x="21" y="11" width="3" height="10" rx="1.5" fill="#fff"/></svg>
@@ -0,0 +1,31 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
2
+ <symbol id="search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="6.5"/><path d="m20 20-4.2-4.2"/></symbol>
3
+ <symbol id="play" viewBox="0 0 24 24"><path d="M8 5.5v13a.6.6 0 0 0 .9.5l10.2-6.5a.6.6 0 0 0 0-1L8.9 5a.6.6 0 0 0-.9.5Z" fill="currentColor" stroke="none"/></symbol>
4
+ <symbol id="pause" viewBox="0 0 24 24"><rect x="6.5" y="5" width="3.6" height="14" rx="1" fill="currentColor" stroke="none"/><rect x="13.9" y="5" width="3.6" height="14" rx="1" fill="currentColor" stroke="none"/></symbol>
5
+ <symbol id="back15" viewBox="0 0 24 24"><path d="M4 12a8 8 0 1 0 2.4-5.7"/><path d="M4 4v4h4"/><text x="12" y="15.2" font-size="7.2" text-anchor="middle" fill="currentColor" stroke="none" font-family="Inter, sans-serif" font-weight="600">15</text></symbol>
6
+ <symbol id="fwd15" viewBox="0 0 24 24"><path d="M20 12a8 8 0 1 1-2.4-5.7"/><path d="M20 4v4h-4"/><text x="12" y="15.2" font-size="7.2" text-anchor="middle" fill="currentColor" stroke="none" font-family="Inter, sans-serif" font-weight="600">15</text></symbol>
7
+ <symbol id="calendar" viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15" rx="2.5"/><path d="M3.5 10h17M8 3v4M16 3v4"/></symbol>
8
+ <symbol id="clock" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></symbol>
9
+ <symbol id="users" viewBox="0 0 24 24"><circle cx="9" cy="8.5" r="3.5"/><path d="M2.5 19.5c.8-3.3 3.4-5 6.5-5s5.7 1.7 6.5 5"/><path d="M16 5.2a3.5 3.5 0 0 1 0 6.6M18 14.6c1.8.7 3 2.4 3.5 4.9"/></symbol>
10
+ <symbol id="mic" viewBox="0 0 24 24"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21"/></symbol>
11
+ <symbol id="video" viewBox="0 0 24 24"><rect x="3" y="6" width="13" height="12" rx="2.5"/><path d="m16 10.5 5-3v9l-5-3"/></symbol>
12
+ <symbol id="check" viewBox="0 0 24 24"><path d="m5 12.5 4.5 4.5L19 7.5"/></symbol>
13
+ <symbol id="more" viewBox="0 0 24 24"><circle cx="5.5" cy="12" r="1.3" fill="currentColor"/><circle cx="12" cy="12" r="1.3" fill="currentColor"/><circle cx="18.5" cy="12" r="1.3" fill="currentColor"/></symbol>
14
+ <symbol id="copy" viewBox="0 0 24 24"><rect x="8.5" y="8.5" width="12" height="12" rx="2.5"/><path d="M15.5 8.5V6a2.5 2.5 0 0 0-2.5-2.5H6A2.5 2.5 0 0 0 3.5 6v7A2.5 2.5 0 0 0 6 15.5h2.5"/></symbol>
15
+ <symbol id="sparkle" viewBox="0 0 24 24"><path d="M12 3.5c.5 3.9 2.6 6 6.5 6.5-3.9.5-6 2.6-6.5 6.5-.5-3.9-2.6-6-6.5-6.5 3.9-.5 6-2.6 6.5-6.5Z"/><path d="M18.5 15.5c.2 1.6 1 2.4 2.5 2.5-1.5.2-2.3 1-2.5 2.5-.2-1.5-1-2.3-2.5-2.5 1.5-.1 2.3-.9 2.5-2.5Z"/></symbol>
16
+ <symbol id="refresh" viewBox="0 0 24 24"><path d="M20 11a8 8 0 0 0-14.3-4.6L4 8.5"/><path d="M4 4v4.5h4.5"/><path d="M4 13a8 8 0 0 0 14.3 4.6l1.7-2.1"/><path d="M20 20v-4.5h-4.5"/></symbol>
17
+ <symbol id="trash" viewBox="0 0 24 24"><path d="M4 6.5h16M9.5 6.5V4.5h5v2M6 6.5l1 13a1.5 1.5 0 0 0 1.5 1.4h7a1.5 1.5 0 0 0 1.5-1.4l1-13"/></symbol>
18
+ <symbol id="file" viewBox="0 0 24 24"><path d="M13.5 3.5H7A2.5 2.5 0 0 0 4.5 6v12A2.5 2.5 0 0 0 7 20.5h10a2.5 2.5 0 0 0 2.5-2.5V9.5l-6-6Z"/><path d="M13.5 3.5v6h6M8.5 13.5h7M8.5 17h5"/></symbol>
19
+ <symbol id="folder" viewBox="0 0 24 24"><path d="M3.5 7A2.5 2.5 0 0 1 6 4.5h3.6l2 2.5H18A2.5 2.5 0 0 1 20.5 9.5v8A2.5 2.5 0 0 1 18 20H6a2.5 2.5 0 0 1-2.5-2.5V7Z"/></symbol>
20
+ <symbol id="send" viewBox="0 0 24 24"><path d="M12 19V5M6 11l6-6 6 6"/></symbol>
21
+ <symbol id="jump" viewBox="0 0 24 24"><path d="M7 17 17 7M9 7h8v8"/></symbol>
22
+ <symbol id="stop" viewBox="0 0 24 24"><rect x="6.5" y="6.5" width="11" height="11" rx="2" fill="currentColor" stroke="none"/></symbol>
23
+ <symbol id="audio-off" viewBox="0 0 24 24"><path d="M4 9.5v5h3.5L12 18.5v-13L7.5 9.5H4Z"/><path d="m16 9.5 5 5M21 9.5l-5 5"/></symbol>
24
+ <symbol id="edit" viewBox="0 0 24 24"><path d="M4.5 19.5h4l10-10a2.8 2.8 0 0 0-4-4l-10 10v4Z"/></symbol>
25
+ <symbol id="home" viewBox="0 0 24 24"><path d="M4 10.5 12 4l8 6.5V19a1.5 1.5 0 0 1-1.5 1.5H15v-6H9v6H5.5A1.5 1.5 0 0 1 4 19v-8.5Z"/></symbol>
26
+ <symbol id="check-square" viewBox="0 0 24 24"><rect x="4" y="4" width="16" height="16" rx="3.5"/><path d="m8.5 12.2 2.4 2.4 4.8-5"/></symbol>
27
+ <symbol id="settings" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19 12a7 7 0 0 0-.1-1.2l2-1.5-2-3.4-2.3.9a7 7 0 0 0-2-1.2L14.2 3h-4.4l-.4 2.6a7 7 0 0 0-2 1.2l-2.3-.9-2 3.4 2 1.5a7 7 0 0 0 0 2.4l-2 1.5 2 3.4 2.3-.9a7 7 0 0 0 2 1.2l.4 2.6h4.4l.4-2.6a7 7 0 0 0 2-1.2l2.3.9 2-3.4-2-1.5c.1-.4.1-.8.1-1.2Z"/></symbol>
28
+ <symbol id="mail" viewBox="0 0 24 24"><rect x="3.5" y="5.5" width="17" height="13" rx="2.5"/><path d="m4.5 7 7.5 6 7.5-6"/></symbol>
29
+ <symbol id="pen" viewBox="0 0 24 24"><path d="M4.5 19.5h4l10-10a2.8 2.8 0 0 0-4-4l-10 10v4Z"/><path d="M13 7l4 4"/></symbol>
30
+ <symbol id="merge" viewBox="0 0 24 24"><path d="M7 4v5a5 5 0 0 0 5 5h5"/><path d="M14 11l3 3-3 3"/><path d="M7 20v-4"/></symbol>
31
+ </svg>
@@ -0,0 +1,57 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="wirenote-token" content="{{TOKEN}}">
7
+ <meta name="color-scheme" content="light dark">
8
+ <title>Wirenote</title>
9
+ <link rel="icon" href="/static/icon.svg" type="image/svg+xml">
10
+ <link rel="stylesheet" href="/static/app.css">
11
+ <script src="/static/app.js" defer></script>
12
+ </head>
13
+ <body>
14
+ <div class="app">
15
+ <aside class="sidebar">
16
+ <a class="brand" href="#/">
17
+ <span class="brand-mark" aria-hidden="true"></span>
18
+ <span>Wirenote</span>
19
+ </a>
20
+ <button id="record-btn" class="record-btn" type="button">
21
+ <span class="rec-dot" aria-hidden="true"></span><span id="record-label">Record a meeting</span>
22
+ </button>
23
+ <nav class="nav" aria-label="Sections">
24
+ <a class="nav-item" href="#/" data-nav="home"><svg class="icon"><use href="/static/icons.svg#home"/></svg>Home</a>
25
+ <a class="nav-item" href="#/ask" data-nav="ask"><svg class="icon"><use href="/static/icons.svg#sparkle"/></svg>Ask your meetings</a>
26
+ <a class="nav-item" href="#/tasks" data-nav="tasks"><svg class="icon"><use href="/static/icons.svg#check-square"/></svg>Action items<span id="tasks-count" class="nav-count"></span></a>
27
+ <a class="nav-item" href="#/settings" data-nav="settings"><svg class="icon"><use href="/static/icons.svg#settings"/></svg>Settings</a>
28
+ </nav>
29
+ <label class="search">
30
+ <svg class="icon" aria-hidden="true"><use href="/static/icons.svg#search"/></svg>
31
+ <input id="search" type="search" placeholder="Search meetings" autocomplete="off" spellcheck="false">
32
+ <kbd>Ctrl K</kbd>
33
+ </label>
34
+ <nav id="list" class="list" aria-label="Meetings"></nav>
35
+ <footer id="sidebar-status" class="sidebar-status"></footer>
36
+ <div class="about">Wirenote {{VERSION}} · AGPL-3.0 · <a href="https://github.com/knowhrishi/wirenote" target="_blank" rel="noopener noreferrer">Source</a></div>
37
+ </aside>
38
+
39
+ <div class="content">
40
+ <div id="banner" class="banner" hidden></div>
41
+ <main id="main" class="main" tabindex="-1"></main>
42
+ <div id="player" class="player" hidden>
43
+ <button class="btn-icon" id="p-back" title="Back 15 s (←)"><svg class="icon"><use href="/static/icons.svg#back15"/></svg></button>
44
+ <button class="btn-play" id="p-play" title="Play (Space)"><svg class="icon"><use href="/static/icons.svg#play"/></svg></button>
45
+ <button class="btn-icon" id="p-fwd" title="Forward 15 s (→)"><svg class="icon"><use href="/static/icons.svg#fwd15"/></svg></button>
46
+ <span class="p-time" id="p-time">0:00</span>
47
+ <input class="p-scrub" id="p-scrub" type="range" min="0" max="1000" value="0" aria-label="Position">
48
+ <span class="p-time" id="p-dur">0:00</span>
49
+ <button class="btn-chip" id="p-speed" title="Playback speed">1×</button>
50
+ <audio id="audio" preload="none"></audio>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <div id="toast" class="toast" role="status" aria-live="polite"></div>
55
+ <div id="modal" class="modal" hidden></div>
56
+ </body>
57
+ </html>
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="light dark">
7
+ <title>Wirenote</title>
8
+ <link rel="icon" href="/static/icon.svg" type="image/svg+xml">
9
+ <link rel="stylesheet" href="/static/app.css">
10
+ </head>
11
+ <body>
12
+ <main class="login">
13
+ <img src="/static/icon.svg" alt="" width="48" height="48">
14
+ <h1>Open Wirenote from your app menu</h1>
15
+ <p>For your privacy, Wirenote only opens through its launcher. Start <b>Wirenote</b> from the app menu, or run <code>wirenote open</code> in a terminal.</p>
16
+ <p class="hint">A login link works once and for one minute.</p>
17
+ </main>
18
+ </body>
19
+ </html>
@@ -0,0 +1,106 @@
1
+ Metadata-Version: 2.5
2
+ Name: wirenote
3
+ Version: 0.1.0
4
+ Summary: Private meeting notes for Linux: detects calls, records, transcribes and summarizes locally.
5
+ Project-URL: Homepage, https://github.com/knowhrishi/wirenote
6
+ Project-URL: Issues, https://github.com/knowhrishi/wirenote/issues
7
+ Project-URL: Changelog, https://github.com/knowhrishi/wirenote/blob/main/CHANGELOG.md
8
+ Author: Hrishikesh Jadhav
9
+ License-Expression: AGPL-3.0-or-later
10
+ License-File: LICENSE
11
+ Keywords: linux,meeting notes,pipewire,privacy,transcription,whisper
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: No Input/Output (Daemon)
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
23
+ Classifier: Topic :: Office/Business
24
+ Requires-Python: <3.15,>=3.11
25
+ Requires-Dist: anthropic>=2.3.0
26
+ Requires-Dist: dbus-fast>=2.0
27
+ Requires-Dist: faster-whisper>=1.2.1
28
+ Requires-Dist: icalendar>=7.3.0
29
+ Requires-Dist: recurring-ical-events>=3.8.2
30
+ Requires-Dist: sherpa-onnx>=2.0.0
31
+ Description-Content-Type: text/markdown
32
+
33
+ # Wirenote
34
+
35
+ Private meeting notes for Linux: detects calls, records, transcribes and summarizes locally.
36
+
37
+ When an app starts using your microphone for a call, Wirenote asks whether to record. After the call it writes a Markdown note with a transcript, who said what, a summary, decisions and action items. By default nothing leaves your computer: transcription runs with [faster-whisper](https://github.com/SYSTRAN/faster-whisper), speakers are told apart with [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx), and summaries come from a local model through [Ollama](https://ollama.com).
38
+
39
+ ![Wirenote's meetings app](https://raw.githubusercontent.com/knowhrishi/wirenote/main/docs/screenshot.png)
40
+
41
+ - **Notices calls by itself.** It watches PipeWire for apps that open the mic: Jitsi or any web call in Chrome, Brave or Firefox, Discord, Rocket.Chat, and whatever you add to `apps.toml`. No bot joins your call.
42
+ - **Two clean tracks.** Your mic and the system audio are recorded separately, so "Me" and the others are never mixed up.
43
+ - **Notes you own.** Plain Markdown files in `~/Meetings`, plus a local web app to search calls, play back moments, name speakers, tick off action items and ask questions about past meetings.
44
+ - **Private by default.** Files are readable only by you, the web app only by your user, and the cloud is opt-in. See [PRIVACY.md](https://github.com/knowhrishi/wirenote/blob/main/PRIVACY.md).
45
+
46
+ ## Requirements
47
+
48
+ - Linux on **x86_64 or ARM64** with **PipeWire** (most current distributions), and a desktop with notifications. Tested on **KDE Plasma 6 (Wayland)**; GNOME and others should work but are not tested yet. macOS and Windows are not supported.
49
+ - **Python 3.11 to 3.14**, and [uv](https://docs.astral.sh/uv/). uv downloads a matching Python if yours is newer or older.
50
+ - **ffmpeg** (for playback in the web app).
51
+ - About 2 GB of disk for the speech models, downloaded once on the first note.
52
+ - Optional: [Ollama](https://ollama.com) for local summaries, or an Anthropic API key for summaries by Claude.
53
+
54
+ ## Install
55
+
56
+ ```sh
57
+ uv tool install wirenote
58
+ wirenote setup install # systemd user services and an app-menu entry; no root needed
59
+ wirenote doctor # checks PipeWire, notifications, models, summaries
60
+ ```
61
+
62
+ To install from source instead: `uv tool install git+https://github.com/knowhrishi/wirenote`.
63
+
64
+ For local summaries, install Ollama and pull the default model:
65
+
66
+ ```sh
67
+ ollama pull qwen3:4b
68
+ ```
69
+
70
+ ## Your first note
71
+
72
+ 1. Join a call. After a few seconds a notification asks **Record** or **Ignore**.
73
+ 2. Click **Record** and tell the others. If you set a consent line in Settings, it is now on your clipboard, ready to paste into the call chat.
74
+ 3. Leave the call. A few minutes later "Meeting note ready" appears.
75
+ 4. Click **Open note**, or open **Wirenote** from the app menu.
76
+
77
+ Everything else, from calendars to commands to files, is in [docs/usage.md](https://github.com/knowhrishi/wirenote/blob/main/docs/usage.md).
78
+
79
+ ## Recording law
80
+
81
+ **You are responsible for getting consent; in many countries (for example Germany, §201 StGB) recording without it is a crime.** Wirenote never records without your click, shows a notification for as long as it records, and can copy a consent line for the call chat. Set it in the app's Settings.
82
+
83
+ ## Privacy in brief
84
+
85
+ - Audio, transcripts, notes, voice prints and settings stay on your computer, readable only by your user.
86
+ - The meetings app listens on 127.0.0.1 and only lets your own user in.
87
+ - Speech models are downloaded once from Hugging Face. There is no telemetry.
88
+ - **Claude is opt-in.** If you choose it, transcripts and notes are sent to Anthropic; the app shows exactly what before you switch, and marks each call "Local" or "Sent to Claude".
89
+
90
+ Details: [PRIVACY.md](https://github.com/knowhrishi/wirenote/blob/main/PRIVACY.md). Security reports: [SECURITY.md](https://github.com/knowhrishi/wirenote/blob/main/SECURITY.md).
91
+
92
+ ## Uninstall
93
+
94
+ ```sh
95
+ wirenote setup uninstall # services and app-menu entry; your data stays
96
+ wirenote setup uninstall --purge # also recordings, transcripts and settings (asks first); notes stay
97
+ uv tool uninstall wirenote
98
+ ```
99
+
100
+ ## Contributing
101
+
102
+ Bug reports and pull requests are welcome; see [CONTRIBUTING.md](https://github.com/knowhrishi/wirenote/blob/main/CONTRIBUTING.md). Pull requests need a one-time [Contributor License Agreement](https://github.com/knowhrishi/wirenote/blob/main/CLA.md), so that the project can later offer a supported edition for companies; your contributions stay available as open source. Please follow the [code of conduct](https://github.com/knowhrishi/wirenote/blob/main/CODE_OF_CONDUCT.md).
103
+
104
+ ## License
105
+
106
+ Wirenote is free software under the [GNU Affero General Public License v3.0 or later](https://github.com/knowhrishi/wirenote/blob/main/LICENSE). Third-party components and models are listed in [THIRD_PARTY.md](https://github.com/knowhrishi/wirenote/blob/main/THIRD_PARTY.md).
@@ -0,0 +1,60 @@
1
+ wirenote/__init__.py,sha256=LTjjaoSmwHU7f_Hsw91GmLadh4Xz9oyQZz4BMLwLs3A,106
2
+ wirenote/cli.py,sha256=BNWtb522K1oZXDcuiqiXZ_KEXlHbpCE_xuaGULKL2_E,9957
3
+ wirenote/calendar/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
4
+ wirenote/calendar/ics.py,sha256=QvXQSmXdspDZtPftmPcIDjkQQczumloddQm3EQcfGyk,9531
5
+ wirenote/capture/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
6
+ wirenote/capture/recorder.py,sha256=C5oJSy_BF5tNbI74KdpaxWo0Qytxx_tlUru3Va-fdwY,10699
7
+ wirenote/capture/wav.py,sha256=xHv7VwKZ58FIugcXUTvP4rAMvQ6uRFNjl9DIetbiRjo,2104
8
+ wirenote/config/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
9
+ wirenote/config/apps.py,sha256=mfKp43Ni8VKVokb5s_nfCLWulxzA3kTdSK7Ie7b2eao,5247
10
+ wirenote/config/migrate.py,sha256=aqpZ-g-fHja_Un5lmxcGuyQeJLUo4FeNJUxRyAWZIcY,4791
11
+ wirenote/config/perms.py,sha256=Nk-NnnAnkGTCjuB3soQsgVJPqDrBKVTJJybTKxpcsQw,2220
12
+ wirenote/config/secrets.py,sha256=x3E7jognlL9-yfSG12Vrx1ZxPU1PwrqzK97nNs0DSqo,3590
13
+ wirenote/config/settings.py,sha256=EQhwhvzC-nKkcCAcepB-yTFml-JFDrpm3in8uTVipqw,7506
14
+ wirenote/config/vocabulary.py,sha256=xqkee8z1MashHWskmV27sec3yQ6qXFi6SadRhx5ZdnA,1006
15
+ wirenote/data/wirenote-ui.service,sha256=B80b573Cn6oqpUykq_IiI7hiBOK8h3ClGOL0jmgLNx8,418
16
+ wirenote/data/wirenote.desktop,sha256=BQW-5jXbniiCTsRQZV4s5sAlHcZmvPH2BC5et-90knY,249
17
+ wirenote/data/wirenote.service,sha256=Qj5CmWa_oAbggiOa8EgOFEz8FZPvE9cpWZP5TnCxUg0,439
18
+ wirenote/detector/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
19
+ wirenote/detector/core.py,sha256=9HqoizACeR2fyfcSxEfQJBS4aM2yOXIqTYGtsFZ6sfc,4877
20
+ wirenote/detector/daemon.py,sha256=ohdw9lV1hvVfJpnjUfoboOOVPNylYS3U3yGpEwBtbD4,34909
21
+ wirenote/detector/graph.py,sha256=2b4WLBB3YYctCoM7q3gsPkmpcNtsAk2dr6Zf2aNiLXk,3429
22
+ wirenote/detector/identity.py,sha256=ckiPjRyFd-KpzxB-IgIHOQ5eA2lU6mBPeqrzqvgNwjQ,6692
23
+ wirenote/detector/streams.py,sha256=SW25nog3Oheqmwx7bGFXGSLy0_BgwrOmgB9Biqw-1ow,2338
24
+ wirenote/detector/tracker.py,sha256=G3iGpaz55Ara5hgf55dAYwaP9XkI_7oviSXUOIwC170,11701
25
+ wirenote/net/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
26
+ wirenote/net/peer.py,sha256=70uTGA3mhLDSNCLI22nNafF1PEQczQrjCaW2541kID4,3803
27
+ wirenote/notify/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
28
+ wirenote/notify/clipboard.py,sha256=9DdkzYx0BrzIeo8B_51CMK_5Tzfq6cGtbQbznV0AmPE,1663
29
+ wirenote/notify/dbus.py,sha256=lAT8DcJDsAH1qEkQWMm-YswlzMQ8O3ed9LmE6ScNfh0,3976
30
+ wirenote/process/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
31
+ wirenote/process/jobs.py,sha256=IveFIM-g2bXx1JZUtmrdOT9BSnw2A62IRYXt6PlIFI4,4510
32
+ wirenote/process/merge.py,sha256=JRAPu7ZI-Z5aDyd-95V1OZIEyp6H8HgKkC_Xp0OloEo,3032
33
+ wirenote/process/models.py,sha256=3uDRd_ZrCzKJHPtTOMLFT7CkCJO1mBTNI4P2AB6f62U,2233
34
+ wirenote/process/note.py,sha256=ljjhXYeMoWiL9ZCD36YC7UUnT-4OoxbpOBjuiWhlaJw,5193
35
+ wirenote/process/speakers.py,sha256=UmhKQR4AidCbdLAtEKdIrK5OC-vtnbLZHCDYhOYeFcc,11867
36
+ wirenote/process/summarize.py,sha256=1Ej5N2pM2Qh9SXYDNPzJFUPGYzypMzXy90bGUL8y17U,12633
37
+ wirenote/process/transcribe.py,sha256=YFirPDI4DZiAFKLQnzpQWOQSDFCsPtmQjjAHFuBLLQ8,4500
38
+ wirenote/process/worker.py,sha256=3_oAq-D6YyxCIsJI1e0AkcYycFkB713QeGmWk9ybFiA,10439
39
+ wirenote/tools/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
40
+ wirenote/tools/dump_streams.py,sha256=ktScgshaJ9AOYcIAhdowhMpmAX2YK5zOdZu2VucINhw,24264
41
+ wirenote/tools/install.py,sha256=J1YSC3CstFrTKDYzqhUc0yJPt39aavz1Iv_I-aFoNB8,5074
42
+ wirenote/tools/setup.py,sha256=DN9dD_nPK6rGgBzwrZL50_5AF6AHhGhen5ufueE1Y30,14247
43
+ wirenote/ui/__init__.py,sha256=Zu1q2FjKsjELUZBAuFN1sP3nJiry2BbPamMdmUPELlY,84
44
+ wirenote/ui/data.py,sha256=gUjRIB2SSmh0vz9aZ_UvXY1lzK75Isn0WS3kYTfwGIk,35095
45
+ wirenote/ui/launch.py,sha256=74QFlt6ARHqol_TdlSiR4piKCLRjN-MV8uMj6-eBuos,2551
46
+ wirenote/ui/server.py,sha256=lLcjSG-7dFlUYV2euFWzN3RH_5pTHxZKciq_JNGm4V4,18683
47
+ wirenote/ui/static/app.css,sha256=EmeL783_EywsNgj1Yqpc7OMiP4spW-4UpF0UdYkiKAg,30646
48
+ wirenote/ui/static/app.js,sha256=O67j5I-6yp-TGBF4GV0KizmHza_ABc-wrm7Pla5hyAE,61759
49
+ wirenote/ui/static/icon.svg,sha256=eIQBVeqEK-CeYAy0ca55d6CbDlRvcXSPp6TMSk_cmro,310
50
+ wirenote/ui/static/icons.svg,sha256=7QYCdZKVAOGqrwZ_hX2IKsSOkhyTcpjMQx0kqVBfHlc,4938
51
+ wirenote/ui/static/index.html,sha256=f8ZPH4KTAJI7igU9PD7WFgnfjSWcaizokciHTEM9CNM,3161
52
+ wirenote/ui/static/login.html,sha256=YJMz4SyEuQebBGj-zSdtM3Ty_PydTrSP5k1nbWmT9Wg,728
53
+ wirenote/ui/static/fonts/OFL.txt,sha256=GKq_GQhIcl4ldu77XCm6BqrBAp0CEyJSp_MS6sLlDPM,4314
54
+ wirenote/ui/static/fonts/inter-latin-ext.woff2,sha256=SPVA-3EWa_ZaD-GHpx-tUAxDFD0-LkIDj1J-OMeG6Q8,74328
55
+ wirenote/ui/static/fonts/inter-latin.woff2,sha256=8FLuRMNyjf0jq6ikVnFQvDFNI5AwJvu2rQiUIsLfVq8,48444
56
+ wirenote-0.1.0.dist-info/METADATA,sha256=cMn5mDn8BuZh5QvbI-UoTj90G1qDbq8e3E9kBrge18Q,6335
57
+ wirenote-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
58
+ wirenote-0.1.0.dist-info/entry_points.txt,sha256=pNusZf7zY1eHKHXFEuCVRlsTybEvbqvc1DTzT9Y9z38,47
59
+ wirenote-0.1.0.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
60
+ wirenote-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ wirenote = wirenote.cli:main