CaviraOSS/PageLM: a self-hosted NotebookLM alternative for quizzes, flashcards and podcasts
PageLM is a community driven version of NotebookLM & a education platform that transforms study materials into interactive resources like quizzes, flashcards, notes, and podcasts.
At a glance
- What is it?
- PageLM turns PDFs, DOCX files and lecture recordings into quizzes, Cornell-style notes, flashcards and audio. Here is how the Node and React stack is wired, how to run it with Docker, and where the model-provider setup gets awkward.
- Who is it for?
- Adopt PageLM if you already hold API keys for one of the supported providers, want the study material on your own disk, and are willing to treat the backend as the thing you actually maintain. Skip it if you need a hosted service with a support contract, or if the PageLM Community License terms have not been read by whoever signs off on procurement.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 6 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What PageLM solves, and for whom
NotebookLM answers questions about documents you upload, but the generation step lives on Google's servers and the output formats are fixed by Google. PageLM takes the same premise and makes the pipeline yours: the README describes it as "a community driven version of NotebookLM & a education platform that transforms study materials into interactive resources like quizzes, flashcards, notes, and podcasts." The audience is narrow and identifiable. A student who wants spaced-repetition cards out of a lecture PDF, a teacher generating a quiz bank from a chapter, or a researcher who wants an audio summary of a paper they have not read yet. It is not a course management system, and it does not grade anyone.
The distinguishing feature is the output set. Contextual chat is table stakes. SmartNotes produces Cornell-style notes, flashcards are extracted with an explicit non-overlap constraint so the same fact is not tested twice, quizzes carry hints and explanations, and the podcast generator turns notes into audio through a text-to-speech stage. Voice transcription goes the other direction: lecture recordings become searchable text. ExamLab simulates an exam and returns feedback. Each of these is a separate generation path over the same ingested document set, which is why the repository is organised as a backend service plus a Vite frontend rather than a single script.
How the ingestion and generation pipeline is wired
The architecture is a Node.js and TypeScript backend using LangChain and LangGraph, with a Vite, React and TailwindCSS frontend. Document parsing is handled by pdf-parse for PDFs and mammoth for DOCX, with Markdown and TXT accepted as plain text. LangChain text splitters cut the parsed text into chunks, an embedding provider converts them to vectors, and retrieval feeds the generation prompts.
Storage is the part worth understanding before you deploy. The default database mode is JSON, set by the db_mode key in .env.example. That means embeddings and retrieval state live in files rather than a vector database, which keeps the install trivial and makes the storage directory the unit you back up. The README states that a vector database is optional, and the environment file exposes EMB_PROVIDER separately from LLM_PROVIDER, so you can embed with OpenAI while generating with Gemini or a local Ollama model. Generated content is written to file-based persistent storage, and the docker-compose.yml mounts ./storage into the backend container at /app/storage, which is where that state accumulates.
Streaming is over WebSockets rather than request and response. The README lists WebSocket streaming for real-time chat, notes and podcast generation. Podcast audio is produced through node-edge-tts in the dependency list, with Google Cloud text-to-speech packages also present, so the TTS layer is swappable in the same way the LLM layer is.
Installing PageLM with Docker and running a first quiz
The repository ships setup.sh, setup.ps1 and a docker-compose.yml, so there are two routes: the platform setup scripts or Compose directly. Prerequisites are Node.js 21.18.0 or newer, per the engines field in package.json and the badge in the README.
The Compose file defines two services, pagelm-backend on port 5000 and pagelm-frontend on port 5173, and the backend reads its configuration from ./.env. Copy the example file and fill in at least one provider key before starting anything:
Where PageLM breaks down
The JSON storage mode is the first real limitation. It is the default, and it is fine for a single user with a handful of documents. It is not a retrieval layer built for concurrent writers, and the README does not describe any locking, compaction or migration path for that file store. If you are pointing this at a shared course folder with dozens of documents and several simultaneous users, the optional vector database is not really optional.
Provider configuration is the second. The environment file mixes conventions: gemini and db_mode are lowercase, OPENAI_API_KEY and LLM_PROVIDER are uppercase, and the Gemini key is literally named gemini. That is a small thing until you are debugging a silent fallback at midnight. There is also no release history in the repository, so there is no changelog to consult when an upgrade changes a key name.
Third, the licence. The badge reads PageLM Community License, the repository metadata reports NOASSERTION, and LICENSE.md is the file that governs use. A community licence is not the same as MIT or Apache-2.0, and nothing in the README summarises the terms. For a personal study tool this is unlikely to matter. For anything institutional, read the file before you build on it.
Finally, the wrong-tool case. PageLM is a generation platform, not a study system. There is no spaced-repetition scheduler, no progress tracking across sessions, and no integration with Anki or a similar review tool described in the README. If your workflow depends on a scheduler deciding what you review today, PageLM produces the cards but not the schedule.
PageLM against NotebookLM and the other open clones
The obvious comparison is NotebookLM itself. Google's product is hosted, requires no keys, and handles the infrastructure. PageLM requires you to supply API credentials and run two containers, and in exchange the documents, the embeddings and the generated audio stay on storage you control. If your material is public lecture slides, that trade is not worth much. If it is patient notes, internal training material or anything under an NDA, it is the whole point.
The other names that come up alongside PageLM are InsightsLM, NotebookLlama, KnowNote and Notebookmlx, all of which appear in the same search space. The README does not describe any of them, so the honest comparison is structural rather than feature-by-feature. What PageLM does differently within its own category is breadth of output: chat, Cornell notes, flashcards, quizzes, podcasts, transcription, an exam simulator, a debate mode and a homework planner, all behind one backend with a shared embedding store. The narrower clones tend to do one of those well. That breadth is also the cost: nine generation paths means nine prompt surfaces to keep working when a provider changes a model name, and the LLM_PROVIDER list is long enough that no single configuration is likely to be exercised by the maintainers on every commit.
Maintenance, upgrades and what the licence means in practice
The last push to the default branch was on 2026-08-29, which is recent, and the repository is not archived. There are no releases in the repository, so upgrades happen by pulling main and rebuilding. That has a concrete consequence: docker-compose up --build will pick up whatever is on the branch, and because the configuration keys are read from a mounted .env, a renamed key surfaces as a runtime failure rather than a build error. Keep a copy of your working .env outside the repository before you pull.
Node.js 21.18.0 is the floor. The dependency list is large and includes Google Cloud speech and text-to-speech packages, LangChain, LangGraph, pdf-lib, docxtemplater and pizzip, so a clean install pulls a substantial tree. The overrides block in package.json pins several transitive packages, including a fork of expr-eval and newer versions of tar and fast-xml-parser, which suggests the maintainers are tracking upstream advisories manually. That is a maintenance signal in both directions: someone is paying attention, and the dependency surface is wide enough to need it.
On licensing, the repository reports NOASSERTION and the README badge names the PageLM Community License, with LICENSE.md as the governing file. Nothing here constitutes legal advice. The practical point is that a community licence typically carries conditions that MIT does not, and the only way to know which ones apply to your deployment is to read that file.
Editorial conclusion
Adopt PageLM if you already hold API keys for one of the supported providers, want the study material on your own disk, and are willing to treat the backend as the thing you actually maintain. Skip it if you need a hosted service with a support contract, or if the PageLM Community License terms have not been read by whoever signs off on procurement. Before committing, run docker-compose up with db_mode=json and a single quiz against your own PDF, then read LICENSE.md in full.
Frequently asked questions
Is Google LMS free?
The README does not cover Google LMS, so there is nothing to confirm about its pricing. PageLM is a separate, self-hosted project, and its own cost profile is the API keys you supply plus whatever hardware runs the containers.
What are some open-source alternatives to NotebookLM?
PageLM is one: the README describes it as a community driven version of NotebookLM that turns study materials into quizzes, flashcards, notes and podcasts. Other names that appear in the same search space include InsightsLM, NotebookLlama, KnowNote and Notebookmlx, though the PageLM README does not describe how any of them work.
What is PageLM and how does it differ from NotebookLM?
PageLM is a TypeScript platform that converts uploaded PDF, DOCX, Markdown and TXT files into interactive study resources. The difference is deployment: you run the Node backend and React frontend yourself, supply your own LLM and embedding provider keys, and the documents and generated audio stay in the storage directory you mount.
Which LLM and embedding providers can PageLM use?
LLM_PROVIDER accepts gemini, openai, claude, grok, ollama, openrouter or minimax, and EMB_PROVIDER is set separately and supports openai, gemini and ollama according to the README. A local Ollama setup is possible, which keeps generation on your own machine.
Does PageLM need a vector database?
No, not for a first run. The db_mode key defaults to json, and the README describes the vector database as optional. The docker-compose.yml mounts ./storage into the backend at /app/storage, and that directory is where the JSON-backed embedding and generated content state lives.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/caviraoss-pagelm)