Opened via file:// — video conversion & some CDNs need a local server. Run python -m http.server in this folder, then open http://localhost:8000.

Lumen.

a quiet, powerful place for documents, images & studying

everything runs locally in your browser — files never leave your device

Lumen is built for desktops & laptops — on a phone, the whiteboard, converters and study desk are limited. Pinch-zoom works inside the image viewer itself.
Recently added
new

LaTeX → PDF

Compile \section, \textbf, tabular, math — locally, in-browser

new

Praxis — Video Generator

Turn any topic into an animated lesson with narration and diagrams

smart

Text → PDF (smart)

Detects headings, bullets, numbered lists and tables in plain text

PDF Editor

Edit text, annotate, insert images and shapes in place

Study & AI

Study Desk

Everything from your last session — recent document, quizzes, decks & notes

Study Workspace

AI agent, PDF/Word viewer, flashcards

Quiz

Interrogate what you read — from the Reader or pasted text

Exam Mode

Timed paper · question palette · mistake analysis

Local Library

Save, search and reopen your work

Whiteboard

Canvas · type text directly · Ctrl+Z

Interactive Diagrams

AI-drawn study diagrams · move, label, quiz yourself

File Narrator (TTS)

System & online natural voices

Dictation

Live transcript as you speak

Chatbot

AI study companion · ask, discuss, explore

YouTube Analysis

Paste a link or transcript → summary, quiz, flashcards, notes

Calendar

Exams · deadlines · reminders that stick

Tasks & Notes

Tasks · timers · alarms · sticky notes

To-Do List

A fast, focused checklist — separate from Tasks

Document Generator

Agreements · Stories · Academic · Research — hidden templates

new

Video Generator

Praxis — AI lesson becomes an animated video with narration, diagrams and captions

Documents

PDF Editor

Edit text · annotate · highlight · insert images and shapes

PDF Merge

Combine multiple PDFs in order

PDF Split

Extract ranges · burst to ZIP

PDF Reorder

Drag · reverse · rotate · delete pages

Reverse PDF

Flip pages from last to first

new

Dual Page

Split a PDF into odd & even halves for manual duplex — with delay pages and reverse order

smart

Text → PDF

Auto-structures plain text · headings · bullets · tables · Markdown & math

new

LaTeX → PDF

\section · \item · \textbf · tabular · math — compiled locally

Word → PDF

Pictures, headings & lists preserved

Watermark

Stamp PDFs & Word documents

PDF Compressor

Re-encodes embedded images, keeps text sharp

PDF Unlocker

Remove owner-password restrictions

Images, Video & Utilities

Image Viewer / Editor

View, edit, remove backgrounds

Images to PDF

Combine images into PDF

Image Compressor

AVIF, WebP, MozJPEG — sized by measured quality

Video Compressor

H.264, VP9, AV1 — best of several encodes

Audio Extractor

Extract audio from video

Audio Compressor

Opus, AAC, MP3, FLAC + loudness

JPG ↔ PNG ↔ WebP

Image format converter

HTML Viewer

Open, render & inspect local HTML in a sandbox

QR Generator

Create QR codes

Poster Tiler

Big image → print-ready pages

MKV → MP4

Video converter · Doc → PDF · CSV ↔ JSON

00:00 / 00:00

Local Library

Stored only in this browser's IndexedDB — no cookies, no server. Clearing site data wipes it; cache-only clears are safe. Use Backup JSON / Restore for a portable copy.

Loading library…

What works offline
  1. Everything stored on your device — Library, notebooks, quizzes, flashcards, notes, interactive diagrams, exam history, whiteboards, tasks, calendar, all previously generated content.
  2. All PDF tools — merge, split, reorder, watermark, compress, Markdown→PDF, Word→PDF, Images→PDF. The PDF engine is cached after first use.
  3. All image tools — viewer/editor, compressor, format converter, poster tiler, background remover.
  4. Whiteboard, diagrams, study views, exam mode, tasks, calendar, QR generator, HTML viewer.
  5. AI with Ollama if Ollama is running on your own computer or a machine on your LAN. Cloud AI, by contrast, needs internet.
  6. Dictation (Local whisper model) once the model has been downloaded at least once. Uses the browser's own engine offline too.
  7. Video & audio conversion once the FFmpeg core (~25 MB) has been downloaded at least once.

Requires internet: cloud AI (Gemini / OpenAI / Claude / OpenRouter), YouTube transcript fetch, free web search, the online narrator voice, and the first-time download of the Whisper or FFmpeg engines.

Tasks & Notes

Tasks · timers · alarms · sticky notes — all saved locally.

⏱ Pomodoro
25:00
Work · 25 min
no document

Put a document on the desk

Drop a PDF or Word (.docx) file anywhere in this pane, or open one. You get thumbnails, outline, full-text search, selection → AI, and one-click narration. Reader documents are read-only here, so there is no edit undo control.

Document Generator

Chat-driven drafting with hidden templates — Agreements, Stories, Academic, Research, Reports, Letters, Resumes and more.

—

Start a new document

Pick a type on the left, fill the fields, then press Generate. The document streams here and you can keep refining it in the chat box below.

PDF Merge

Stack any number of PDFs into one file, in order.

Drop PDFs here

or click to choose — add as many as you like

PDF Split

Extract ranges, or burst a PDF into parts.

Drop a PDF here

or click to choose one

Reverse PDF

Flip every page from last to first without changing page content.

Drop a PDF here

or click to choose one

PDF Reorder

Drag pages into a new order, rotate or delete them.

Drop a PDF here

or click to choose one

Text → PDF

Type or paste Markdown — it renders beside you as you type, then export a clean, paginated PDF with bold, italics, code, tables and images preserved.

Formatting supported in the exported PDF: # h1 · ## h2 · ### h3 · **bold** · *italic* · `code` · > quote · - list · 1. list · --- rule · ```code``` · | table | · [link](https://…)

Text→PDF embeds Noto fonts for Latin and supported writing systems, including Devanagari, Bengali, Punjabi (Gurmukhi), Gujarati, Tamil, Telugu, Kannada, Malayalam, Arabic, Hebrew, Thai, Chinese, Japanese and Korean. Fonts load as needed; if a required font or shaping step fails, the build reports an error instead of silently producing missing-glyph boxes. Common symbols are preserved where supported.

Advanced

Word → PDF

Pictures, headings, lists, bold & italic are preserved — margins on every side.

Drop a Word document

.docx — with its images, in their original order

Watermark

Stamp text across every page of a PDF or a Word document.

Drop a PDF or Word file

.pdf · .docx — Word is converted first, pictures intact

PDF Unlocker

Remove restrictions from PDFs that open without a password. Everything is processed locally — nothing is uploaded.

Drop a protected PDF

or click to choose — unlocker handles owner-password restrictions

Image Viewer / Editor

Zoom (wheel or pinch), crop, draw, remove backgrounds, invert — every pixel stays local.

bg
zoom 100% brush
Drop an image here

or click to choose, or paste from the clipboard (Ctrl+V) — PNG, JPEG, WebP, GIF

Whiteboard

100%

Images to PDF

Combine images into one tidy document.

Drop images here

or click to choose — PNG, JPEG, WebP, GIF, BMP

Audio Extractor

Pull the sound track out of any video — decoded locally, exported as WAV.

Drop a video or audio file

or click to choose — mp4, webm, mov, mkv, mp3, m4a, wav…

Image Converter

PNG, JPEG and WebP — one file or a whole batch.

Drop images here

or click to choose — add as many as you like

QR Generator

Crisp codes as PNG or SVG — links, Wi-Fi, text, anything.

HTML Viewer

Open a single HTML file — or a whole folder with its CSS, JS, images and other assets. Everything runs sandboxed on this device.

zoom 100%
All scripts run in an isolated sandbox and cannot touch Lumen or your Library.

Poster & Image Tiler

Cut a big image into printable pages you can tape into a poster — or scale it to an exact physical size. Always rendered at maximum quality.

Drop a poster image

or click to choose one

Custom poster dimensions
The poster is tiled across as many printable pages as it needs. Length + Breadth sets an exact physical size. Total area computes Length × Breadth from the image's own aspect ratio.

Interactive Diagrams

Turn any topic into a study diagram you can explore, quiz yourself on, and export.

100%

File Converter

Drop any file in — get a useful format out. All conversions run on this device.

Drop any file here

or click to choose — images, audio/video, txt/md, csv, json, docx

YouTube Analysis

Paste a video link — Lumen fetches the transcript and turns it into study material. Stuck? Paste the transcript itself.

Transcripts load through Lumen's free proxy mirrors. If a video has no captions, its description is used instead — or paste the transcript with the button above.

OCR & Text Extraction

Read every word from an image or PDF — the vision model does the reading, the file never leaves your device except as an AI request.

checking…
Drop images or PDFs here

PNG · JPG · WebP · PDF — scanned pages welcome

Ollama guide

Connect this website to Ollama on your computer.

Connecting Lumen to Local Ollama

Lumen can connect directly to Ollama running on your own computer, allowing you to use your locally installed AI models inside Lumen.

This is useful because your model runs locally rather than requiring a cloud AI API.

There is one important catch, though:

Lumen is a website, while Ollama is a local server.

Your browser therefore has to make a request from Lumen's website to your computer.

The two addresses are:

Lumen
https://lumendesk.pages.dev

and

Ollama
http://127.0.0.1:11434

Because these are different origins, your browser applies a security mechanism called CORS (Cross-Origin Resource Sharing).

If Ollama doesn't explicitly allow Lumen's origin, the browser request can be rejected with:

403 Forbidden

Lumen then interprets this as Ollama being unreachable.

The solution is to tell Ollama:

Allow requests coming from https://lumendesk.pages.dev.

That's what OLLAMA_ORIGINS does.

Using an AI Agent — Recommended for Beginners

If you're unfamiliar with environment variables, PowerShell, or restarting background services, you can use an AI coding/terminal agent to help configure this.

Examples include:

The agent doesn't need to modify Lumen itself. Its job is simply to:

  1. Check whether Ollama is installed and running.
  2. Check the current OLLAMA_ORIGINS configuration.
  3. Set the correct origin if necessary.
  4. Restart Ollama.
  5. Test whether the browser origin is accepted.
  6. Tell you exactly what worked or what is still wrong.

How much AI usage will this consume?

Very little. This isn't a large coding project. A capable agent should normally only need a small number of terminal commands and a short conversation. For example, the agent may need to:

Check Ollama
Check OLLAMA_ORIGINS
Set variable
Restart Ollama
Run CORS test
Done

So you shouldn't need to spend hundreds of thousands of tokens on this. A few thousand tokens or less is generally plenty for the actual troubleshooting. If an agent somehow turns this into a 47-file software architecture project, it has gotten way too excited.

Recommended approach

Give the agent the prompt below before letting it make changes. That way, it knows exactly what you're trying to accomplish and is less likely to start changing unrelated settings.

Prompt for an AI Agent

Copy this into OpenCode, Codex, Antigravity, or a similar agent:

I need to connect my locally installed Ollama server to the Lumen website: https://lumendesk.pages.dev Ollama normally runs locally at: http://127.0.0.1:11434 Lumen is showing Ollama as unreachable, and I suspect this is a CORS issue. Please diagnose the problem and configure Ollama so that browser requests from: https://lumendesk.pages.dev are allowed. Use OLLAMA_ORIGINS for this. On Windows, check the User environment variable first. Please follow this process: 1. Check whether Ollama is installed and running. 2. Check the current value of OLLAMA_ORIGINS. 3. If necessary, set the User-level OLLAMA_ORIGINS value to exactly: https://lumendesk.pages.dev 4. Do not change unrelated environment variables. 5. Do not expose Ollama to the internet. 6. Do not set OLLAMA_HOST to 0.0.0.0. 7. Do not port-forward port 11434. 8. Fully restart Ollama so it reads the new environment variable. 9. Test the Ollama API. 10. Test a request containing: Origin: https://lumendesk.pages.dev against: http://127.0.0.1:11434/api/tags 11. Confirm whether the response is HTTP 200. 12. If it still returns 403, diagnose the actual cause rather than randomly changing settings. Do not delete, move, reinstall, or modify my Ollama models. Do not make unrelated system changes. At the end, clearly tell me: - whether Ollama is running - what OLLAMA_ORIGINS is set to - whether the CORS test returned 200 - what Base URL I should enter into Lumen - whether I need to do anything else Ask for confirmation before making any potentially unrelated or risky system changes.

One important thing

Don't give an agent unnecessary permissions just because it says it needs them. For this task, it should not need to:

The task is basically an environment-variable + restart + test job.

Requirements

Before beginning, make sure you have:

For example:

ollama pull llama3.2

Check your installed models:

ollama list

Step 1 — Confirm Ollama Is Running

Open this in your browser:

http://127.0.0.1:11434

You should see:

Ollama is running

If you don't, launch Ollama and wait for it to start.

Terminal test

You can also run:

curl.exe http://127.0.0.1:11434/api/tags

If Ollama is working, you'll receive JSON containing your installed models.

Step 2 — Allow Lumen's Origin

This is the actual CORS fix. Set:

OLLAMA_ORIGINS=https://lumendesk.pages.dev

Windows — easiest method

  1. Press Windows.
  2. Search for Edit the system environment variables.
  3. Open it.
  4. Click Environment Variables...
  5. Under User variables, click New...
  6. Enter:

Variable name

OLLAMA_ORIGINS

Variable value

https://lumendesk.pages.dev

Click OK through all the dialogs.

Or use PowerShell

Run:

[Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS","https://lumendesk.pages.dev","User")

Step 3 — Restart Ollama — VERY IMPORTANT

Changing the environment variable doesn't automatically update an Ollama process that is already running. Ollama needs to start again so it can read the new value.

Windows

  1. Right-click the Ollama icon in the system tray.
  2. Choose Quit.
  3. Launch Ollama again from the Start menu.

macOS

Quit Ollama completely and relaunch it.

Linux

If you're running Ollama as a system service:

sudo systemctl restart ollama

The restart is essential. Without it, you can correctly set OLLAMA_ORIGINS and still get a 403 because the old Ollama process is still running with its previous configuration.

Step 4 — Test the CORS Configuration

This is the best way to determine whether the problem is actually fixed. On Windows:

curl.exe -s -o NUL -w "%{http_code}" -H "Origin: https://lumendesk.pages.dev" http://127.0.0.1:11434/api/tags

You want:

200

200 — Success

Great! Ollama accepted a request carrying Lumen's origin. You can move on to Lumen.

403 — Still rejected

Ollama is still rejecting the origin. Continue to Troubleshooting.

Step 5 — Connect Ollama in Lumen

Open:

https://lumendesk.pages.dev

Go to Settings and select:

Provider: Ollama

Base URL:

http://127.0.0.1:11434

Then select a model that you've already downloaded with Ollama. For example:

llama3.2

Send a test message. If everything is configured correctly, Lumen should now be able to communicate with your local model.

Troubleshooting

Still getting 403?

Check the environment variable:

[Environment]::GetEnvironmentVariable("OLLAMA_ORIGINS","User")

It should output exactly:

https://lumendesk.pages.dev

Make sure there aren't:

Then fully restart Ollama again.

Diagnostic test: temporarily allow all origins

If you're certain everything looks correct but you're still getting 403, you can temporarily test whether the problem is definitely the origin restriction.

Set:

[Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS","*","User")

Restart Ollama. Then run the CORS test again:

curl.exe -s -o NUL -w "%{http_code}" -H "Origin: https://lumendesk.pages.dev" http://127.0.0.1:11434/api/tags

If you now get 200, then you've confirmed that the problem is the origin configuration.

Afterwards, change it back

Don't leave it at * unnecessarily. Set it back to:

[Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS","https://lumendesk.pages.dev","User")

Then restart Ollama one more time.

Lumen Still Says "Ollama Unreachable"

Work through these checks:

Check 1 — Ollama

Open: http://127.0.0.1:11434 — Does it say Ollama is running?

Check 2 — Models

Run: ollama list — Make sure at least one model is installed.

Check 3 — API

Run: curl.exe http://127.0.0.1:11434/api/tags — You should receive JSON.

Check 4 — CORS

Run the CORS test above. You want 200.

Check 5 — Try localhost

If Lumen still can't connect using http://127.0.0.1:11434, try http://localhost:11434 as the Base URL.

Security Notes

This setup is designed to keep Ollama local.

The intended architecture is:

             Internet
                |
                v
       +-----------------+
       |      Lumen      |
       | lumendesk.pages |
       +--------+--------+
                |
          Browser request
                |
                v
       +-----------------+
       |   127.0.0.1     |
       |     :11434      |
       +--------+--------+
                |
                v
         +----------+
         |  Ollama  |
         +----+-----+
              |
              v
       Your local model

You do not need to expose Ollama to the internet.

Avoid doing things like:

What OLLAMA_ORIGINS Actually Does

It's worth understanding what you're changing. The browser essentially tells Ollama:

"I'm making this request from: https://lumendesk.pages.dev"

Ollama checks whether that origin is allowed.

Without the configuration:

Lumen -> Ollama
       X Origin not allowed
       -> 403

With OLLAMA_ORIGINS=https://lumendesk.pages.dev:

Lumen -> Ollama
       OK: Origin allowed
       -> 200

Your model itself doesn't change. Your downloaded model files don't change. You're simply telling Ollama which web origin is allowed to communicate with it.

TL;DR

If you're comfortable with the terminal:

1. Set the origin

[Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS","https://lumendesk.pages.dev","User")

2. Restart Ollama

Quit Ollama completely -> launch it again.

3. Test

curl.exe -s -o NUL -w "%{http_code}" -H "Origin: https://lumendesk.pages.dev" http://127.0.0.1:11434/api/tags

You want: 200

4. Lumen

Provider: Ollama
Base URL: http://127.0.0.1:11434

Choose your installed model. Done.

Final Recommendation

If you aren't comfortable with the terminal, I recommend using an agent like OpenCode, Codex, or Antigravity for this setup.

This is exactly the kind of small system-configuration task where an agent is useful: it can inspect your current configuration, run the appropriate commands, restart Ollama, and verify the result rather than making you hunt through Windows settings yourself.

And importantly, this should be a very small agent task. You don't need to burn through a giant context window or use an expensive model. A lightweight but competent coding model should generally be more than enough.

Just give the agent the prompt above and tell it:

Diagnose this first. Don't make unrelated changes.

That one sentence can save you from the classic AI-agent experience of asking it to fix one environment variable and watching it decide that your entire computer needs a spiritual reboot.

AI Providers
Keys are stored only in this browser. Without an AI provider, Chat uses free Web Search. For Ollama setup and troubleshooting, open the dedicated Ollama guide page below.
How to get a free API key quick start
Google Gemini Free tier available
  1. Go to aistudio.google.com/apikey
  2. Sign in with your Google account
  3. Click Create API key — it's instant and free (no credit card)
  4. Copy the key (starts with AIza…)
  5. Back here: select Google in the dropdown → Add provider → paste the key

Free quota: ~1,500 requests/day with gemini-2.5-flash. Best starting point.

OpenAI
  1. Go to platform.openai.com/api-keys
  2. Create account → add a small credit ($5 is plenty for months of use)
  3. Click Create new secret key → copy it (starts with sk-…)
  4. Select OpenAI → Add provider → paste the key
OpenRouter Free models available
  1. Go to openrouter.ai/keys
  2. Sign up (free) → click Create Key
  3. Many models (Llama, Gemma, Mistral) are completely free with rate limits
  4. Select OpenRouter → Add provider → paste key → pick a free model
Anthropic (Claude)
  1. Go to console.anthropic.com
  2. Create account → add credit → click Create Key (starts with sk-ant-…)
  3. Select Anthropic → Add provider → paste the key

🔒 All keys are stored only in your browser (localStorage) — they are never sent to Lumen servers.

OpenAI · Gemini · Claude · Ollama · OpenRouter · Custom
0
Ctrl+Shift+C toggles

PDF Editor

Edit text, annotate, insert images and shapes — everything on-device.

Drop a PDF here

or choose a file — then click the page to add text, shapes, highlights, images or notes.