A beautiful Liquid Glass to-do list, right in your toolbar. A Chrome extension to add tasks, give them due dates in your time zone and tick them off — private, fully offline and nothing to sign up for.
📖 Read the user manual — every part of the popup explained, known issues and how to report a problem.
- User manual
- Highlights
- Screenshots
- Install
- Using LiquidDo
- How it works
- Development
- Releasing
- Privacy
- Contributing
- License & trademarks
| ➕ Quick add | Click the icon and start typing — the task box is focused. Enter adds the task. |
| 📅 Due dates, your time zone | A calendar glyph on every task: Today / Tomorrow / Next week, a month calendar, a time field and any time zone in the world. |
| 🚦 Due at a glance | Labels read Due Today, 5:30 PM, Due Monday… or red Overdue — amber when due within a day. |
| ✅ Active & Completed | Tick tasks off to move them to Completed; tick again to bring them back. Clear all completed at once. |
| 🪟 Liquid Glass design | Frosted glass, soft gradients, rounded Nunito type with a Lora Italic wordmark, and one corner radius throughout. |
| 🔒 Private & offline | No analytics, no servers, no accounts, no network requests — fonts are bundled. Only the storage permission. |
| Your list | Due date & time zone |
|---|---|
![]() |
![]() |
Install LiquidDo from the Chrome Web Store, then pin it from the puzzle-piece menu. (GitHub Releases carry release notes only; the packaged extension is distributed through the store.)
git clone https://github.com/theysap/LiquidDo.git
cd LiquidDo
npm installOpen chrome://extensions, turn on Developer mode, click Load unpacked and select the src/ folder. After editing, press ↻ on the extension card and reopen the popup.
| Action | How |
|---|---|
| Add a task | Type in the box, press Enter or click + |
| Set a due date | Click the calendar glyph at the right end of the task |
| Complete / un-complete | Click the circle next to a task |
| Delete a task | Hover it and click ✕ |
| Clear completed | Completed tab → Clear all completed |
| Report a problem | Report an issue at the bottom of the popup |
Full details: user manual.
LiquidDo is a single Manifest V3 action popup — no background worker, no content scripts, no host permissions and no build step for the extension itself.
-
tasks.jsholds the pure logic (time-ago, due-date labels, time-zone maths viaIntl) and is shared by the popup and the unit tests. -
popup.jsrenders the list and the due date sheet and saves on every change. -
Tasks are an array under
liquiddo_tasksinchrome.storage.local:{ (id, text, done, createdAt, completedAt, dueAt, tz); }
dueAtis an absolute timestamp;tzis the IANA zone it was set in (e.g.Asia/Tokyo), used to show the wall-clock time in that zone. -
No network: Lora (wordmark) and Nunito (everything else) are bundled as WOFF2 in
src/fonts/, and the manifest's content security policy (default-src 'self') blocks remote loads.npm run validatefails if a remote URL appears in the HTML/CSS or a network API in the JS.
Requirements: Node.js 22+, npm, Chrome.
npm install # also installs the git hooks (husky)
npm run check # lint + unit tests + manifest/version validation
npm run build # dist/liquiddo-vX.Y.Z.zip| Script | Purpose |
|---|---|
npm run lint |
ESLint, Stylelint and Prettier (check) |
npm run format |
Prettier (write) |
npm test |
Node's built-in test runner over tests/ |
npm run validate |
Manifest shape, referenced files, version sync, changelog entry, no remote resources |
npm run build |
Deterministic zip in dist/ |
npm run screenshots |
Store screenshots + promo tiles into chrome/vX.Y.Z/ (-- --docs also refreshes README images) |
npm run release:local |
Full Chrome Web Store bundle into chrome/vX.Y.Z/ (see below) |
npm run bump -- x.y.z |
Set the version in package.json, package-lock.json and the manifest |
npm run assets |
Re-render the icons from assets/logo.svg (add -- --brand <dir> for 4K masters) |
src/ ← the extension (load this folder unpacked)
manifest.json
popup.html · popup.css · popup.js
tasks.js pure task / due-date / time-zone helpers
fonts.css · fonts/ bundled Lora Italic + Nunito (OFL)
icons/ generated from assets/ — don't edit by hand
scripts/ build, zip, validate, bump, assets, screenshots, release notes, hooks
tests/ unit tests
store/listing.md Chrome Web Store copy template
assets/logo.svg logo source — the popup header mark (logo-small.svg: 16–32 px variant)
docs/screenshots/ README images
.github/ CI + release workflows, issue / PR templates
.husky/ pre-commit & commit-msg hooks
- pre-commit — refuses anything under
chrome/, runs lint-staged (ESLint / Stylelint / Prettier on staged files), the unit tests and the validator. - commit-msg — the subject must be exactly
vX.Y.Z, matching the version inpackage.json, with any details in the commit body;Co-authored-bytrailers are rejected. - Every commit bumps the version (
npm run bump -- x.y.z) and adds a matching section to CHANGELOG.md (Keep a Changelog format).
Public releases are cut after testing — ordinary commits are versioned but not released.
-
npm run bump -- 1.1.0, write the## [1.1.0]section inCHANGELOG.md, commit with the subjectv1.1.0. -
npm run release:local— buildschrome/v1.1.0/for the Chrome Web Store:File Use liquiddo-v1.1.0.zipUpload in the Developer Dashboard store-icon-128x128.pngStore icon promo-small-440x280.pngSmall promo tile promo-marquee-1400x560.pngMarquee promo tile screenshot-1…5-*.pngFive 1280×800 screenshots, opaque PNG brand/4096 / 1024 / 512 px logo masters store-listing.mdName, summary, description, permission justifications, privacy answers, reviewer notes privacy-policy.mdPrivacy policy text chrome/is git-ignored and blocked by the pre-commit hook — it never reaches the repository. -
Upload
chrome/v1.1.0/liquiddo-v1.1.0.zipand the listing assets in the Chrome Web Store Developer Dashboard. -
git tag v1.1.0 && git push origin master --tags— the Release workflow re-runs every check, confirms the tag matches the manifest and publishes a GitHub Release with notes from the changelog. No zip is attached — the zip is only for the Chrome Web Store.
ci.yml runs on every push and pull request: lint, unit tests, validation, the commit-message convention for the pushed range, and a build check (the zip is not uploaded anywhere).
LiquidDo collects nothing and makes no network requests: no analytics, no telemetry, no accounts. Tasks live only in chrome.storage.local on your computer. Full policy: PRIVACY.md.
Found a bug? See How to report an issue. Issues and pull requests are welcome — please use the templates. Before opening a PR run npm run check, bump the version and add a changelog entry.
MIT © 2026 Aashish Paruvada. Bundled fonts: Lora and Nunito, SIL Open Font License 1.1.
LiquidDo is an independent project and is not affiliated with, endorsed by or sponsored by Apple or Google. "Liquid Glass" is referenced only to describe the design inspiration.

