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.

What the socket error means

Only one usage of each socket address means Ollama is already running on port 11434. Do not start a second copy. The command failed because the first Ollama process already owns that port.

Recommended Windows Desktop setup

Ollama Desktop may run a tray app, a server process, and an updater. The server inherits environment variables from the process that launches it. Changing the user environment in Windows does not update an already-running tray app.

  1. Open PowerShell. Do not paste the PS C:\...> prompt text, and do not type Markdown links into commands.
  2. Persist the exact deployed origin for future launches:
[Environment]::SetEnvironmentVariable('OLLAMA_ORIGINS','https://lumendesk.pages.dev','User')
  1. Kill the tray app, server, and updater so the environment is rebuilt:
Stop-Process -Name 'ollama','ollama app' -Force -ErrorAction SilentlyContinue
  1. Set the variable in this PowerShell session, then relaunch the Desktop app. Replace the path if Ollama is installed elsewhere:
$env:OLLAMA_ORIGINS='https://lumendesk.pages.dev' Start-Process -FilePath 'C:\Users\YOUR_NAME\AppData\Local\Programs\Ollama\ollama app.exe'

Do not run a second ollama serve while the Desktop app is running. The Desktop app will spawn the one server that owns port 11434. A bind error means another server is already using that port.

Check that Ollama is working

Open this address on the same computer:

http://localhost:11434/api/tags

You should see JSON containing installed models. Your result showing TcpTestSucceeded : True means IPv4 is working. The warning for ::1 only says IPv6 localhost is unavailable; it is harmless because Ollama is listening on 127.0.0.1. Run:

Get-Process ollama Test-NetConnection localhost -Port 11434

The second command should show TcpTestSucceeded : True.

To verify the browser origin specifically from PowerShell, use curl.exe, not curl (PowerShell aliases curl to another command):

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

The result should be 200. To inspect the allowed-origin header:

curl.exe -s -D - -o NUL -H "Origin: https://lumendesk.pages.dev" http://127.0.0.1:11434/api/tags

Look for Access-Control-Allow-Origin: https://lumendesk.pages.dev. This confirms the running server, not only the registry, has the correct setting.

Connect this website locally

When this website is open on the same computer as Ollama, use:

http://127.0.0.1:11434

Do not open Lumen.html by double-clicking it for Ollama. A file:// page sends the browser origin null, so Ollama can return 403 even when its server is healthy. In the Lumen folder, run:

python -m http.server 8000

Then open http://localhost:8000/Lumen.html. In AI Providers, choose Ollama, press ↻ live, select an installed model, then press Test.

Use this website from a phone

On a phone, localhost means the phone itself, not your computer. Replace it with your computer's LAN IPv4 address. In PowerShell, type:

ipconfig

Find the section for the connection you are actually using, usually Wireless LAN adapter Wi-Fi. Copy the value beside IPv4 Address, for example 192.168.0.110. Ignore Default Gateway, IPv6 addresses, and disconnected adapters.

  1. On the computer, run ipconfig and find the active adapter's IPv4 address, such as 192.168.1.20.
  2. Start Ollama so it listens beyond localhost:
$env:OLLAMA_HOST="0.0.0.0:11434"; $env:OLLAMA_ORIGINS="*"; ollama serve
  1. In this website's Ollama provider, replace the Base URL with http://192.168.0.110:11434, substituting your own IPv4 address if it differs.
  2. Allow Ollama or TCP port 11434 through Windows Firewall.
  3. Keep the phone and computer on the same Wi-Fi network.

If the browser says CORS or “could not read Ollama”

If the error says allow file://, that is a file-page limitation: the browser actually sends Origin: null. Use the localhost Python server above instead of trying to add file://. This website is now hosted at https://lumendesk.pages.dev; for its deployed version, the exact Ollama origin is https://lumendesk.pages.dev without the /#/home hash. If the error happens on http://localhost:8000 or the deployed HTTPS page, stop the background process with Stop-Process -Name ollama -Force, set OLLAMA_ORIGINS, then start exactly one ollama server and press ↻ live again.

Also check that the URL uses the correct protocol, address, and port. This website must be opened over http://localhost or your normal HTTPS address, not an unreachable computer name.

Model and performance checks

ollama list ollama pull qwen3-vl:4b

Use a model shown by ollama list. Smaller models start faster and use less memory. After the model list appears in Lumen, select the exact provider/model from the AI model selector before using Chat, summaries, quizzes, or flashcards.

Getting help safely

For setup or debugging, you can ask ChatGPT, GitHub Copilot, Codex, an Antigravity-style coding agent, or another trusted coding assistant to inspect the exact error. Share the command output and environment details, but remove API keys, passwords, private file paths, and personal network details unless they are necessary. Ask the assistant to give one command at a time and to preserve the existing Lumen file rather than rewriting it.

Quick diagnosis

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