Clarity for everyday life.
A browser app that helps you understand complex information, think through decisions, organise overwhelming tasks, and reset when life gets to be too much. Nine tabs, each doing one thing.
The third app in the Lewis family suite, alongside Writer's Flow (writing) and Steady Ground (kids' learning). Same philosophy: a thinking partner, not a replacement for your own brain.
The model runs on your computer or phone, inside the browser, using WebGPU. There is no server, no account, and no API call. What you paste into Clear Ground — the medical letter, the lease, the thing you're dreading saying — never travels anywhere, because there is nowhere for it to go.
Four small settings are remembered between visits (whether you've seen the welcome, your theme, your text size, and whether the model is already downloaded). Nothing you write is among them. Everything you type lives in memory and is gone when you close the tab.
Double-click start.bat. That's the whole thing. It starts a small local
server, opens Chrome for you, and prints the address in case you need it:
http://localhost:8765/
Leave the black window open while you're using the app. To stop, close that window.
If Node.js isn't installed it falls back to Python, and if neither is there it tells you where to get Node and what to click. Port 8765 is deliberate — 8000 is what local AI servers like LM Studio use, and sharing it causes clashes.
cd clear-ground
node serve.js # or: python -m http.server 8765
Clear Ground cannot be opened by double-clicking index.html. It uses ES
modules, a web worker and a service worker, and browsers block all three over a
file:// path — you'd get a blank page. It has to be served over HTTP, which is
all start.bat is for.
The first visit downloads the model (~811 MB) from the Hugging Face CDN. That happens once — after that it's cached on the device and the app works with no internet connection at all. Use wifi.
Push to a GitHub Pages repo and it works as-is. The .nojekyll file matters —
without it, Pages ignores some files. No model weights are committed (see
.gitignore); they're fetched from Hugging Face at runtime.
| Tab | What it does | |
|---|---|---|
| 📋 | Break It Down | Complex text → plain language |
| 📖 | What Does This Mean? | A word or abbreviation → a clear explanation |
| 🎯 | What's The Point? | Something long → just the key takeaways |
| 🪜 | Step By Step | An overwhelming task → small, doable steps |
| 🔄 | Another Angle | Something that didn't click → three other explanations |
| 🧠 | What Am I Missing? | Your thinking → the angles you haven't considered |
| 💬 | Help Me Say This | A hard conversation → the actual words |
| ⚖️ | Weigh My Options | A decision → the options laid out with tradeoffs |
| 🌊 | Reset | A minute to breathe. Works with an empty box. |
| File | What's in it |
|---|---|
index.html | Page structure — sidebar, panel, welcome cards, loading gate |
style.css | The dawn/clarity theme, night mode, print and reduced-motion rules |
app.js | Tabs, per-tab state, markdown rendering, everything on screen |
prompts.js | All nine tab definitions and their system prompts |
safety.js | Input and output filters, crisis handling, the storage-key list |
worker.js | Runs the model off the main thread, so the page never freezes |
sw.js | Caches the app shell so it opens offline |
start.bat | Double-click to run it locally |
serve.js | The little server start.bat uses. Not part of the app. |
Two notes worth knowing before editing:
The safety preamble is not in prompts.js. safety.js prepends it at send
time, so a tab added later can't accidentally ship without it.
The filters in safety.js are deliberately narrow, and there are comments
explaining each choice. A lease that says "act as trustee", or a policy with a
suicide clause, is exactly the kind of document this app exists to untangle —
refusing to help with it would be a worse failure than any prompt injection
could cause on a local model with no tools.
cleanOutput() in safety.js removes three things from every answer. False
claims of support ("there are people and resources here who care about you" —
there are not; it is a program on a laptop) are removed without exception.
Unanswerable questions and offers ("Would you like me to…", "Let me know")
are removed too, because each tab is one turn and there is no reply box, so
they read as the app ignoring you. Reflective questions are kept on purpose —
"Which option would you regret NOT trying?" is the whole point of Weigh My
Options. The line is whether the question expects an answer to come back here.
Structural debris goes last — empty list items (- ") left behind when the
model runs out of things to say mid-list, and headings with nothing under them.
LiquidAI/LFM2.5-1.2B-Instruct-ONNX,
Q4 quantised, via @huggingface/transformers on WebGPU.
It's a small model, and it is kept close to the user's own words on purpose — reorganising, restating and reframing rather than generating new facts. That framing is the main defence against it making things up.
v1.0.2 · Aug 2026
Shown in the sidebar footer. If it ever reads "reload to update", the page and its cached service worker disagree — reload once more and it'll clear.
This app simplifies and clarifies. It does not replace a lawyer, a doctor, or a financial advisor, and it says so where it matters.
1 commits
JavaScript
73.1%
CSS
19.2%
HTML
6.6%
Batchfile
1.1%
Clarity for everyday life.
A browser app that helps you understand complex information, think through decisions, organise overwhelming tasks, and reset when life gets to be too much. Nine tabs, each doing one thing.
The third app in the Lewis family suite, alongside Writer's Flow (writing) and Steady Ground (kids' learning). Same philosophy: a thinking partner, not a replacement for your own brain.
The model runs on your computer or phone, inside the browser, using WebGPU. There is no server, no account, and no API call. What you paste into Clear Ground — the medical letter, the lease, the thing you're dreading saying — never travels anywhere, because there is nowhere for it to go.
Four small settings are remembered between visits (whether you've seen the welcome, your theme, your text size, and whether the model is already downloaded). Nothing you write is among them. Everything you type lives in memory and is gone when you close the tab.
Double-click start.bat. That's the whole thing. It starts a small local
server, opens Chrome for you, and prints the address in case you need it:
http://localhost:8765/
Leave the black window open while you're using the app. To stop, close that window.
If Node.js isn't installed it falls back to Python, and if neither is there it tells you where to get Node and what to click. Port 8765 is deliberate — 8000 is what local AI servers like LM Studio use, and sharing it causes clashes.
cd clear-ground
node serve.js # or: python -m http.server 8765
Clear Ground cannot be opened by double-clicking index.html. It uses ES
modules, a web worker and a service worker, and browsers block all three over a
file:// path — you'd get a blank page. It has to be served over HTTP, which is
all start.bat is for.
The first visit downloads the model (~811 MB) from the Hugging Face CDN. That happens once — after that it's cached on the device and the app works with no internet connection at all. Use wifi.
Push to a GitHub Pages repo and it works as-is. The .nojekyll file matters —
without it, Pages ignores some files. No model weights are committed (see
.gitignore); they're fetched from Hugging Face at runtime.
| Tab | What it does | |
|---|---|---|
| 📋 | Break It Down | Complex text → plain language |
| 📖 | What Does This Mean? | A word or abbreviation → a clear explanation |
| 🎯 | What's The Point? | Something long → just the key takeaways |
| 🪜 | Step By Step | An overwhelming task → small, doable steps |
| 🔄 | Another Angle | Something that didn't click → three other explanations |
| 🧠 | What Am I Missing? | Your thinking → the angles you haven't considered |
| 💬 | Help Me Say This | A hard conversation → the actual words |
| ⚖️ | Weigh My Options | A decision → the options laid out with tradeoffs |
| 🌊 | Reset | A minute to breathe. Works with an empty box. |
| File | What's in it |
|---|---|
index.html | Page structure — sidebar, panel, welcome cards, loading gate |
style.css | The dawn/clarity theme, night mode, print and reduced-motion rules |
app.js | Tabs, per-tab state, markdown rendering, everything on screen |
prompts.js | All nine tab definitions and their system prompts |
safety.js | Input and output filters, crisis handling, the storage-key list |
worker.js | Runs the model off the main thread, so the page never freezes |
sw.js | Caches the app shell so it opens offline |
start.bat | Double-click to run it locally |
serve.js | The little server start.bat uses. Not part of the app. |
Two notes worth knowing before editing:
The safety preamble is not in prompts.js. safety.js prepends it at send
time, so a tab added later can't accidentally ship without it.
The filters in safety.js are deliberately narrow, and there are comments
explaining each choice. A lease that says "act as trustee", or a policy with a
suicide clause, is exactly the kind of document this app exists to untangle —
refusing to help with it would be a worse failure than any prompt injection
could cause on a local model with no tools.
cleanOutput() in safety.js removes three things from every answer. False
claims of support ("there are people and resources here who care about you" —
there are not; it is a program on a laptop) are removed without exception.
Unanswerable questions and offers ("Would you like me to…", "Let me know")
are removed too, because each tab is one turn and there is no reply box, so
they read as the app ignoring you. Reflective questions are kept on purpose —
"Which option would you regret NOT trying?" is the whole point of Weigh My
Options. The line is whether the question expects an answer to come back here.
Structural debris goes last — empty list items (- ") left behind when the
model runs out of things to say mid-list, and headings with nothing under them.
LiquidAI/LFM2.5-1.2B-Instruct-ONNX,
Q4 quantised, via @huggingface/transformers on WebGPU.
It's a small model, and it is kept close to the user's own words on purpose — reorganising, restating and reframing rather than generating new facts. That framing is the main defence against it making things up.
v1.0.2 · Aug 2026
Shown in the sidebar footer. If it ever reads "reload to update", the page and its cached service worker disagree — reload once more and it'll clear.
This app simplifies and clarifies. It does not replace a lawyer, a doctor, or a financial advisor, and it says so where it matters.
1 commits
JavaScript
73.1%
CSS
19.2%
HTML
6.6%
Batchfile
1.1%