Privacy policy for Send to LectureFlow
Send to LectureFlow by Quincy W.
Privacy policy for Send to LectureFlow
Last updated: 27 October 2026
This policy explains what the LectureFlow browser extension "Send to LectureFlow" ("the extension") reads, when it reads it, who it gives it to, and what it keeps. The extension is a companion to the LectureFlow desktop app ("LectureFlow"). Both are open source; the source code is at <https://github.com/ShouldBeQuincy/LectureFlow>.
- The extension talks only to LectureFlow on the same computer. It does not connect to any server of ours (we don't have one). No account, no telemetry, no analytics, no ads.
- The extension reads cookies only when you send a lecture, and then only the cookies of the website that hosts the tracks you selected. It gives them only to LectureFlow on your computer. On platforms whose profile says the media needs no cookies (for example Panopto), it reads none at all. When the player is embedded in another website's page (for example Canvas), the browser keeps its cookies apart for each website it is embedded in (partitioned cookies): LectureFlow gets only the ones kept for the page you send from, and the ones that website keeps for other websites' pages are not given to LectureFlow.
- The extension does not keep cookies. LectureFlow keeps them in memory only, for that one fetch, and never writes them to disk, to its database or to a log.
- The extension does not read course names, course codes, folders or slides.
- On recording platforms you have allowed and that have a platform profile, the extension adds "Send to LectureFlow" buttons to the page and takes only a few fields, named in the profile, from the answers to the platform's own requests. The rest of those answers (including your name or e-mail address) never leaves the page.
- We, the developers, receive no data at all.
| Data | When | What for |
|---|---|---|
| Media elements on the page (the addresses of
<video>, <audio> and <source>, including those in same-origin iframes), the addresses of media files and playlists the page has loaded, and whether the media is DRM-protected | On sites you have allowed: when a recording page opens. On other sites: only after you click the extension's icon | To count how many audio and video tracks on the page can be fetched || Network requests to sites you have allowed: address,
Content-Type and size (read-only; nothing is blocked or changed; only media files and playlists are kept, everything else is ignored) | The browser reports only requests to sites you have allowed; they are kept in memory per tab and dropped when the tab moves to another page or closes | To recognise media files and playlists whose addresses have no file extension || The contents of HLS / DASH playlists; the size of single media files | When a playlist or media file is found | To split a playlist into audio and video tracks and estimate their size |
| The lecture's title, recording date and length; the platform's restriction flag (whether the lecturer or university restricts this stream); the session ID | When the page matches a platform profile, using the CSS selectors written in that profile | To name the tracks and the file; to show the restriction notice when the stream may be restricted (see "Restricted streams and DRM" below); to recognise a lecture you have already sent |
| The address of the current page | Whenever the extension looks at that page (same times as the first row) | To match a platform profile; sent as the Referer when fetching (as browsers do by default: the page address, without the part after
#, when all the chosen tracks are on the page's origin — the same scheme, domain and port; only the page's scheme, domain and port when any track is on another origin; no Referer for plain HTTP tracks on an HTTPS page); without a platform profile, a hash of the normalised address is used as the session ID || Which website's page a recording page is embedded in (scheme, domain and port only: what the browser tells the extension's script in the page, or the tab's address when you allowed the extension that website) | When a recording platform's page is embedded in another website's page (for example Canvas) and you click an in-page button | To decide whether you confirm on the page or in the extension's own confirmation window (see "Buttons inside other websites" below); when reading cookies, to take only the ones kept for the page you are on |
| A few named fields of the JSON answer to the one request, declared in the platform profile, that the platform's page makes itself (for Panopto's
DeliveryInfo: the full recording's address, the media addresses, whether it is audio only, the title and the length; an empty full-recording address is the restriction flag) | On platform pages you have allowed whose profile declares observe, when the page itself makes that request | To find the full recording and the tracks, to tell whether the stream may be restricted, and to name the tracks and the file || On a folder list: the session ID of each row; when you open "Update this course in LectureFlow", also each row's title | On platform list pages you have allowed whose profile declares in-page entries, when the page opens | To show "Imported", fetching progress or "Needs refresh" on the rows, and to recognise lectures already imported when sending several |
| The lecture details of the lectures you send (the extension requests them from the platform at the page's own origin and takes only the declared fields, as in the "named fields" row) | Only after you click "Send to LectureFlow" on a row of the list, or send from "Update this course in LectureFlow", and only for the lectures being sent | A list page does not load each lecture's details; sending needs them to find the tracks, check for restrictions and name the files |
| Cookies of the website that hosts the tracks (when the player is embedded in another website's page, including the ones the browser keeps apart for the page you send from; the ones kept for other websites' pages are not given to LectureFlow. In a Firefox container tab, only that container's; with first-party isolation on, only the ones kept for the website of the page you are on) | Only when you send a lecture (the send button in the popup or the in-page card, or "Resume" on a fetch that needs it); none on platforms whose profile says the media needs no cookies (for example Panopto) | So that LectureFlow can fetch, with your own sign-in, the files you can already play on that page |
The extension does not read course names, course codes, folder structures, slides, any other text or personal information on the page, your browsing history, other tabs, form contents or passwords.
"Sites you have allowed" means recording platforms the extension knows (for example Panopto) and sites you add yourself, after you have agreed in the browser's own permission prompt. At installation the extension has access to no website at all. "Detect automatically on this site" in the popup asks only for the website of the current page; when tracks are on other websites and fetching needs their cookies, those websites are listed separately, unticked, for you to tick one by one.
On recording platforms you have allowed and that have a platform profile (Panopto for now, including Panopto pages embedded in Canvas and other learning platforms), the extension also does the following. On sites without a profile, none of this happens.
- In-page buttons: when the profile declares in-page entries, the extension adds a "Send to LectureFlow" button to the player page, and on a folder list a check box and "Send to LectureFlow" on each row plus an "Update this course in LectureFlow" button. Rows already imported or being fetched show "Imported" or the fetching progress. These elements live in their own shadow DOM and do not change the page's own content or behaviour.
- Watching the platform's own requests: when the profile declares
observe, the extension wrapsfetchandXMLHttpRequestin the page's own JavaScript world. Requests and responses are passed to the page unchanged; only when a response comes from the one address the profile declares does the extension take the declared fields from it (short strings, numbers and booleans only, never a whole object or list), for example Panopto's full-recording address and restriction flag. The rest of the response, including any name or e-mail address in it, is neither kept nor passed on and never leaves the page. The extension makes no request of its own for this. - Lecture details requests: a folder list does not load each lecture's details. Only after you click "Send to LectureFlow" on a row, or send from "Update this course in LectureFlow", does the extension request the details of the lectures being sent, one after another, from the platform at the page's own origin, again taking only the declared fields. The browser attaches that website's cookies as it does for the page's own requests; the extension cannot read them. The results are held in memory only and dropped after 30 minutes or when the tab closes.
- Buttons inside other websites: when a recording platform's page is embedded in another website's page (your school's Canvas, for example), its buttons are there too. So that another website cannot make the recording page transparent and trick you into clicking, the extension first looks at which website it is embedded in. If that website is on your "Trusted embedding sites", the button opens its card on the page as usual, but the confirming button can be clicked only after a short moment, and in Chrome only while the card is really visible. On any other website (or when the browser does not tell which), you confirm in the extension's own small window instead, which a web page can neither cover nor imitate. In that window you can tick "From now on, confirm on the page itself" for that website, which adds it to the trusted list; the extension's settings list those websites, and you can remove them at any time. On a trusted website, when the embedded player is too small to hold the confirmation card (a small player in a course page, for example), you confirm in that small window as well; it then shows no warning about tricked clicks and does not offer to trust the website. "Don’t remind me again for this platform" only turns off the restriction reminder and does not change this confirmation.
- Status on a list page: when a folder list opens, the extension asks LectureFlow on your computer about the session IDs of the rows on that page, to show "Imported" or fetching progress. This stays on your computer and nothing goes online; if LectureFlow is not running, it is not started for this. Only the lectures listed on the current page are handled; folder names and other course information are not read, and other pages are not fetched.
- When a platform profile finds the restriction flag (the lecturer or university restricts this stream), the popup marks the lecture "May be restricted" and shows this notice: "This stream may be restricted by your lecturer’s or university’s policy. LectureFlow only fetches streams you have access to, to this computer, for your personal accessible learning (transcription/translation). Please make sure you follow your school’s rules. You will be reminded once more before sending." You confirm once more when you send, and nothing is sent before you do. When you send several lectures at once, you are reminded once about those that may be restricted and can skip them. In that reminder you can tick "Don’t remind me again for this platform": later sends to that platform go without the reminder, and the notice then says that you turned the reminder off for the platform instead of "You will be reminded once more before sending." The extension's settings list those platforms, and you can turn the reminder back on at any time. It is not ticked unless you tick it. DRM-protected streams are not affected: they are never sent.
- When the media is protected by digital rights management (DRM), the popup shows: "This stream is protected by digital rights management (DRM). LectureFlow does not handle protected content." Such tracks cannot be sent.
The extension is only for the lecture recordings your school gives you. YouTube, and MOOCs and online or paid course platforms (for example Coursera, edX, Udemy, LinkedIn Learning's
/learning, 中国大学 MOOC, Bilibili's course pages), are on the extension's do-not-handle list, the same in every browser's version: on those sites the popup only says "LectureFlow does not work on this site"; the extension does not read those pages, shows no count, cannot be allowed on them and shows no in-page button. When such a site is embedded in another website's page (for example a course tool inside a learning platform), the extension skips the embedded part and the media it loads, whichever server holds the media. LectureFlow refuses tasks from these sites as well.The extension gives data only to LectureFlow on the same computer, through the browser's Native Messaging channel. The browser lets only the extensions LectureFlow has registered use that channel; web pages cannot reach it.
- When you open the popup: the extension's version, the kind of browser and the interface language (to check that both sides are compatible), and the platform and session ID of the lecture on the page (to check whether it was already imported). LectureFlow answers with its own course list, the import state and fetch progress.
- When a folder list with in-page entries opens: the platform and the session IDs of the rows on that page, to show "Imported", fetching progress or "Needs refresh" on the rows. This only asks LectureFlow on your computer and nothing goes online; if LectureFlow is not running, it is not started for this.
- When you open "Update this course in LectureFlow" or change its course: the session IDs of the lectures on that page, their titles as listed, and the course you chose, to recognise lectures already imported.
- When you send a lecture (the send button in the popup or the in-page card, or sending several at once): the addresses of the tracks you chose, the address of the current page (as the Referer; only the page's scheme, domain and port when the tracks are on another origin, see the table above), the cookies of the website hosting those tracks (none when the platform profile says they are not needed), the lecture's title, recording date and length, the session ID, the course you chose, and whether you confirmed that you want to continue when the stream may be restricted (or turned that reminder off for the platform). When sending several, one such set per lecture.
- When you click "Open in LectureFlow": only LectureFlow's own number for that lecture or fetch.
The extension itself sends none of this to any remote address.
To count the tracks and estimate their size, the extension fetches HLS / DASH playlists from the server that hosts the tracks and sends
HEAD requests for single media files; when a server does not answer HEAD or gives no size, it sends one GET request for the first byte only (Range: bytes=0-0) and stops as soon as the response headers arrive, without reading the file. These are the same addresses the page's own player requests, and the browser attaches that website's cookies just as it does during playback; the extension adds nothing else to these requests. There is one other kind of request: when you send lectures from a folder list, the extension requests the details of those lectures from the platform the page belongs to (at the page's own origin; see "What it does on recording platform pages" above). The extension makes no other network requests; watching the platform's own requests involves no request of its own.In the browser's extension storage, the extension keeps only:
- your settings;
- platform profiles you imported from a local file;
- the course you chose last time (its number in LectureFlow), so that it is preselected next time;
- the platforms for which you chose "Don’t remind me again for this platform": only the platform's identifier (for example panopto) and when you chose it, nothing about courses or lectures; turning the reminder back on in the settings deletes it;
- which of the three choices (Main audio & video, Two cameras, Audio only) each lecture you sent was sent with, only so that "Resume" starts with the same tracks: keyed by a hash of the platform and session ID, without title, address or course, the latest 200 at most;
- the embedding websites you trust (when a recording page is embedded in one of them, you confirm sending on the page itself): only the website (scheme, domain and port, for example
https://canvas.example.edu) and when you added it, no page address, course or lecture, 100 at most; removing it in the settings deletes it.
The extension does not keep cookies, track addresses, page addresses or a fetch history (the choices above are only hashes and option names; no lecture title or address can be read from them). What it finds on a page is held in memory for that tab only and is dropped when the tab closes or moves to another page; lecture details fetched for a folder list are likewise held in memory only, and dropped after 30 minutes or when the tab closes.
Site access is managed by the browser; you can withdraw it at any time in the extension's settings or on the browser's extensions page. Uninstalling the extension deletes everything it kept.
- Cookies and full track addresses (which may carry signed parameters) exist only in the memory of the LectureFlow process. They are never written to disk, to the database or to a log, and never appear on a command line. They are cleared as soon as a fetch finishes, is cancelled or needs a refresh. For a fetch that failed, they stay in memory for up to 30 minutes so that you can click "Retry"; then they are cleared and the fetch needs a refresh. Removing that fetch or quitting LectureFlow clears them too. After LectureFlow restarts they are gone, and unfinished fetches are marked "Needs refresh".
- LectureFlow fetches the files to your computer with its built-in fetch tool, aria2c. The cookies and the Referer are handed to aria2c only through an interface on the local loopback address (127.0.0.1) protected by a random secret (after LectureFlow has checked that this interface really belongs to the aria2c it started), and aria2c uses them to request the files directly from the server that hosts the tracks, the same server the player uses. Each cookie is sent only to the website it belongs to. Track addresses that point to this computer are refused; addresses on the local network are fetched only when the recording page itself is on the local network.
- LectureFlow keeps a fetch record in its local database, to show progress and recognise a lecture you send twice: the platform, session ID, lecture title, recording date and length, the course you chose, the page's domain (without its path), each track's type, domain and a hash of its path (neither paths nor query parameters are kept: on some platforms the media path alone is enough to get the file, and signatures and tokens are usually in query parameters), the state and progress, and whether you confirmed that you want to continue when the stream may be restricted. Like the rest of LectureFlow's data, these records stay on your computer only. Failed or cancelled fetches can be removed on the course page; deleting a course deletes its fetch records. Records of finished fetches are kept to recognise duplicates.
- Its logs record track addresses only as the domain and a hash of the path, without the path or query parameters.
- When fetching is done, the recording becomes a lecture in LectureFlow. Transcription, correction and translation then follow LectureFlow's own privacy terms (see the Privacy section of the README): transcription runs on your computer; transcribed text is sent only to the model provider you set up, if you set one up; if you choose to transcribe with Google Colab, the recording is uploaded to Google's servers, and you are told so when you choose it.
- It does not collect, sell or share any data. No telemetry, no analytics.
- No background crawling: it works only on pages you open and fetches only the tracks you tick.
- It does not change the web page: when it wraps
fetch/XMLHttpRequest, requests and responses are passed to the page unchanged; its in-page buttons live in their own shadow DOM and leave the page's own content and behaviour alone. - It does not sign in for you, and does not read or store passwords. The extension itself does not write, change or delete cookies. When you send from a folder list, its lecture details request is the same as the one Panopto's own player page makes and asks the platform to refresh your sign-in; whether the platform then updates its own sign-in cookie is up to the platform, and the browser stores it as usual.
- It does not try to decrypt DRM-protected media, and does not record the screen.
- It does not load or run remote code. Platform profiles are plain data (declarative fields and CSS selectors) and contain no scripts.
"Export detection report" in the popup and in the settings creates a report only when you click it, and redacts it first: cookies are removed; addresses keep only the scheme, domain, path structure and the names of query parameters; text from the page is replaced by placeholders. The report is saved on your computer like any other download, and the extension never uploads it. If you choose to attach it to a public contribution (pull request), it becomes public, so please check it yourself first.
- Unless you send a lecture, the extension reads no cookies, requests no lecture details from the platform and gives no tracks to LectureFlow.
- You can withdraw site access at any time; the extension then looks at a page only when you click its icon, adds no buttons to the page and no longer watches the platform's requests.
- Uninstalling the extension deletes everything it kept. LectureFlow's data stays on your computer (Windows
%APPDATA%\LectureFlow\, macOS~/Library/Application Support/LectureFlow/, or the place you chose in its settings) and is yours to manage. - Since we receive no data, there is no "your data" for us to look up, export or delete.
If the way the extension handles data changes, we will update this policy first and say so in the extension's release notes. If a new permission is needed, the browser will ask for your consent again.
Open an issue at <https://github.com/ShouldBeQuincy/LectureFlow/issues> or email <me@qu1ncy.dev>.