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.
Study & AI

Study Workspace

AI agent, PDF/Word viewer, flashcards

Local Library

Save, search and reopen your work

Whiteboard

Canvas · type text directly · Ctrl+Z

File Narrator (TTS)

System & online natural voices

Dictation

Live transcript as you speak

Documents

PDF Merge

Combine multiple PDFs

PDF Split

Extract page ranges

PDF Reorder

Drag, drop, rotate pages

Text → PDF

Write with markup — get a clean PDF

Word → PDF

Pictures, headings & lists preserved

Watermark Tools

Stamp PDFs & Word documents

PDF Compressor

Reduce file size

Images, Video & Utilities

Image Viewer / Editor

View, edit, remove backgrounds

Images to PDF

Combine images into PDF

Image Compressor

Batch reduce image size

Video Compressor

Re-encode MP4/MKV smaller

Audio Extractor

Extract audio from video

Audio Compressor

Shrink audio to AAC or MP3

JPG ↔ PNG ↔ WebP

Image format converter

QR Generator

Create QR codes

Poster Tiler

Split image across pages

MKV → MP4

Video converter · Doc → PDF · CSV ↔ JSON

Local Library

Your saved work stays in this browser on this device.

Loading library…

Marginalia
25:00focus
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.

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

PDF Reorder

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

Drop a PDF here

or click to choose one

Text → PDF

Write with markup — get a clean, paginated PDF.

Markup: # h1 · ## h2 · ### h3 · **bold** · *italic* · `code` · > quote · - list · 1. list · --- rule · ``` code block```

Standard PDF fonts cover Latin scripts — other writing systems become “?”.

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 Compressor

Clean up the structure, or rasterise pages for real savings.

Drop a PDF here

or click to choose one

Video Compressor

A genuine FFmpeg re-encode — with a cancel button, because in-browser encoding is slow.

Drop a video here

mp4, mkv, webm, mov — re-encoded locally, never renamed

Audio Compressor

Re-encode any audio or video’s sound at a smaller bitrate.

Drop audio or video here

mp3, m4a, wav, flac, ogg — or a video file (sound only)

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

Image Compressor

Batch-shrink images and see exactly how much you saved.

Drop images here

or click to choose — add as many as you like

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.

Poster Tiler

Split one image across printable pages — cut lines automatically avoid slicing through words.

Drop a poster image

or click to choose one

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

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.
OpenAI · Gemini · Claude · Ollama · OpenRouter · Custom