The same nine tabs as the computer version, running on your phone. Install it to your home screen once and it works with no signal — on a plane, in the woods, anywhere.
The model runs inside the browser using WebGPU. Nothing you type is sent anywhere, because there's nowhere for it to go: your phone does the thinking.
Go to https://github.com/new and set:
| Field | Value |
|---|---|
| Repository name | writers-flow |
| Public / Private | Public (Pages is free only for public repos) |
| Add a README | leave unticked |
In PowerShell, in this folder, replacing YOUR-USERNAME:
git remote add origin https://github.com/YOUR-USERNAME/writers-flow.git
git push -u origin main
The first push opens a browser window to sign in to GitHub. That's expected.
(Already pushed once? Just git push — the remote is set.)
In the repository on github.com: Settings → Pages → Source: Deploy from a branch → Branch main, folder / (root) → Save.
After a minute it's live at https://YOUR-USERNAME.github.io/writers-flow/.
After the first time, opening the app loads the model straight from the phone. No download, no signal needed.
Open https://YOUR-USERNAME.github.io/writers-flow/check.html — the
compatibility check. It reports exactly what's missing and how much memory your
phone was willing to give. Send me those numbers.
Tested, on the actual devices:
| Device | Result |
|---|---|
| Desktop PC, Chrome | Works |
| ASUS ROG Phone (12–16 GB RAM) | Works |
| Samsung Galaxy S24 (8 GB RAM) | Loads, then fails when writing |
The S24 downloads the model and loads it, then loses the GPU on the first attention layer:
Failed to create a WebGPU compute pipeline:
A valid external Instance reference no longer exists
That is Chrome reporting a lost graphics device — the phone couldn't hold the model while generating. The app now says so plainly instead of showing a generic error.
So: this wants a phone with memory to spare. Around 12 GB has been proven to work; 8 GB has been proven not to. Somewhere in between is untested.
A lighter float16 build of the same model was tried and then removed deliberately — see the note at the bottom.
Other things worth knowing:
| File | What it does |
|---|---|
index.html | The app |
app.js | Screen logic — tabs, output, download progress |
worker.js | Runs the model. The phone's replacement for the Python server |
prompts.js | The nine tab instructions — edit these |
style.css | Autumn theme, phone-first |
sw.js | Makes the app itself work offline |
manifest.webmanifest | Lets it install to the home screen |
check.html | Compatibility check |
icons/ | Home screen icons |
prompts.js here and prompts.py in the computer version hold the same nine
prompts. If you change one, change the other, or the two versions will start
behaving differently. The tab names are checked to match; the wording isn't.
GitHub rejects any file over 100 MB and refuses to serve Git LFS files through Pages. Our weights are 811 MB, so they can't live here. Instead the app fetches them from Hugging Face's CDN on first run and the browser caches them. This is why the repo is tiny and the first run is slow.
There is a q4f16 build of the same Liquid model — identical 4-bit weights, but
float16 rather than float32 for everything else, so about half the memory while
writing (725 MB instead of 811 MB). It was built as an automatic fallback for
devices that ran out of graphics memory, then removed on request.
The reasoning: swapping the model out underneath the writer to work around a
hardware limit trades a clear failure for a vague one. Better that the app runs
one model well and says honestly when a device can't handle it. If a
lower-memory option is ever wanted again, it's dtype: 'q4f16' in
worker.js — one line.
The computer version lives in ../writers-flow/ and is completely independent.
It has no hardware constraints of this kind and is the one to use day to day
until the phone hardware is there. Neither version affects the other.
9 commits
JavaScript
60.2%
CSS
20.2%
HTML
19.6%
The same nine tabs as the computer version, running on your phone. Install it to your home screen once and it works with no signal — on a plane, in the woods, anywhere.
The model runs inside the browser using WebGPU. Nothing you type is sent anywhere, because there's nowhere for it to go: your phone does the thinking.
Go to https://github.com/new and set:
| Field | Value |
|---|---|
| Repository name | writers-flow |
| Public / Private | Public (Pages is free only for public repos) |
| Add a README | leave unticked |
In PowerShell, in this folder, replacing YOUR-USERNAME:
git remote add origin https://github.com/YOUR-USERNAME/writers-flow.git
git push -u origin main
The first push opens a browser window to sign in to GitHub. That's expected.
(Already pushed once? Just git push — the remote is set.)
In the repository on github.com: Settings → Pages → Source: Deploy from a branch → Branch main, folder / (root) → Save.
After a minute it's live at https://YOUR-USERNAME.github.io/writers-flow/.
After the first time, opening the app loads the model straight from the phone. No download, no signal needed.
Open https://YOUR-USERNAME.github.io/writers-flow/check.html — the
compatibility check. It reports exactly what's missing and how much memory your
phone was willing to give. Send me those numbers.
Tested, on the actual devices:
| Device | Result |
|---|---|
| Desktop PC, Chrome | Works |
| ASUS ROG Phone (12–16 GB RAM) | Works |
| Samsung Galaxy S24 (8 GB RAM) | Loads, then fails when writing |
The S24 downloads the model and loads it, then loses the GPU on the first attention layer:
Failed to create a WebGPU compute pipeline:
A valid external Instance reference no longer exists
That is Chrome reporting a lost graphics device — the phone couldn't hold the model while generating. The app now says so plainly instead of showing a generic error.
So: this wants a phone with memory to spare. Around 12 GB has been proven to work; 8 GB has been proven not to. Somewhere in between is untested.
A lighter float16 build of the same model was tried and then removed deliberately — see the note at the bottom.
Other things worth knowing:
| File | What it does |
|---|---|
index.html | The app |
app.js | Screen logic — tabs, output, download progress |
worker.js | Runs the model. The phone's replacement for the Python server |
prompts.js | The nine tab instructions — edit these |
style.css | Autumn theme, phone-first |
sw.js | Makes the app itself work offline |
manifest.webmanifest | Lets it install to the home screen |
check.html | Compatibility check |
icons/ | Home screen icons |
prompts.js here and prompts.py in the computer version hold the same nine
prompts. If you change one, change the other, or the two versions will start
behaving differently. The tab names are checked to match; the wording isn't.
GitHub rejects any file over 100 MB and refuses to serve Git LFS files through Pages. Our weights are 811 MB, so they can't live here. Instead the app fetches them from Hugging Face's CDN on first run and the browser caches them. This is why the repo is tiny and the first run is slow.
There is a q4f16 build of the same Liquid model — identical 4-bit weights, but
float16 rather than float32 for everything else, so about half the memory while
writing (725 MB instead of 811 MB). It was built as an automatic fallback for
devices that ran out of graphics memory, then removed on request.
The reasoning: swapping the model out underneath the writer to work around a
hardware limit trades a clear failure for a vague one. Better that the app runs
one model well and says honestly when a device can't handle it. If a
lower-memory option is ever wanted again, it's dtype: 'q4f16' in
worker.js — one line.
The computer version lives in ../writers-flow/ and is completely independent.
It has no hardware constraints of this kind and is the one to use day to day
until the phone hardware is there. Neither version affects the other.
9 commits
JavaScript
60.2%
CSS
20.2%
HTML
19.6%