Your day, every time you open a tab.
Chrome Home is a private, self-hosted daily task board for Chromium-based browsers. It replaces the default new-tab page with a focused three-column workflow backed by your own Docker server and SQLite database.
- Completely independent: no Microsoft, Google, SaaS, analytics, or cloud account.
- Self-hosted: one small container and one persistent Docker volume.
- Built for the day: overdue work rolls into My Day while upcoming work stays out of the way.
- Fast new tabs: the interface is packaged locally in the extension; only task data crosses the network.
- Auditable: plain HTML, CSS, JavaScript, Python, and SQLite with no runtime dependencies.
- Works as a website too: the container serves the same dashboard at its root URL.
On the Docker host:
git clone https://github.com/ChrisTitusTech/chrome-home.git
cd chrome-home
cp .env.example .env
openssl rand -hex 32Paste the generated value after CHROME_HOME_API_TOKEN= in .env, then run:
docker compose up -d --build
docker compose ps
curl http://127.0.0.1:8088/api/healthThe dashboard is now available at http://SERVER-IP:8088. For the example
server discussed during development, that is http://10.0.0.200:8088.
- Clone or download this repository on the browser computer.
- Open
chrome://extensionsin Chrome, Chromium, Brave, or Vivaldi. - Turn on Developer mode.
- Select Load unpacked.
- Choose the repository's
extensiondirectory. - Open a new tab.
The first new tab opens the connection dialog. Enter:
- Server URL:
http://10.0.0.200:8088or your own server address. - API token: the value stored in the Docker server's
.envfile.
Chromium will ask permission for the extension to access that server. Chrome Home requests only the specific origin you enter.
Keep the unpacked extension directory in a permanent location. Chromium loads its files from that directory.
- Add a task from the input at the top of the page.
- Move work between To do, In progress, and Done.
- Double-click a card or use its menu to edit details, date, or priority.
- Use My day, Upcoming, and All tasks to change scope.
- Press
Qanywhere outside a form field to focus Quick Add. - In My Day, unfinished overdue tasks appear alongside the selected day's work.
The default Compose configuration is appropriate for a trusted home LAN. If the dashboard will cross an untrusted network, put it behind HTTPS and never publish port 8088 directly to the internet. See Deployment for reverse-proxy, backup, upgrade, and origin-restriction examples.
Chromium new-tab extension Docker server
┌─────────────────────────┐ ┌──────────────────────────┐
│ Local HTML/CSS/JS │ │ Dependency-free Python │
│ Browser-profile token ├─ HTTP(S) ─►│ Bearer-token task API │
│ No remote executable JS │ │ Persistent SQLite data │
└─────────────────────────┘ └──────────────────────────┘
The server also serves the same static dashboard. Browser configuration is
kept in chrome.storage.local for the extension or localStorage for the web
version. Task data lives only in the Docker volume.
| Variable | Default | Purpose |
|---|---|---|
CHROME_HOME_API_TOKEN |
required | Bearer token; exactly 64 hexadecimal characters |
CHROME_HOME_PORT |
8088 |
Port exposed on the Docker host |
CHROME_HOME_BIND_ADDRESS |
0.0.0.0 |
Host address used for the published port |
CHROME_HOME_ALLOWED_ORIGINS |
chrome-extension://* |
Comma-separated browser origins allowed by CORS |
CHROME_HOME_LOG_LEVEL |
INFO |
Server log level |
The default accepts any Chromium extension ID, which supports unpacked
development, and same-origin requests from the hosted dashboard. Every task
operation still requires the bearer token. A stable packaged extension can be
restricted to its exact origin as described in the deployment guide. Use *
only as an explicit troubleshooting override.
Requirements: Python 3.11 or newer, Node.js for the JavaScript syntax check,
Docker with Compose, and optionally zip for packaging.
make test # unit, API, syntax, and manifest checks
make run # build and start the Compose service
make logs # follow service logs
make stop # stop the service without deleting data
make package-extension # create dist/chrome-home-extension.zipThe service intentionally uses only Python's standard library. There is no package installation step and no JavaScript build pipeline.
All task routes require Authorization: Bearer YOUR_TOKEN.
| Method | Route | Description |
|---|---|---|
GET |
/api/health |
Unauthenticated health and version response |
GET |
/api/tasks?scope=day&date=YYYY-MM-DD |
Daily, upcoming, or all-task query |
POST |
/api/tasks |
Create a task |
PATCH |
/api/tasks/{id} |
Update task fields |
DELETE |
/api/tasks/{id} |
Delete a task |
Task statuses are todo, in_progress, and done. Priorities are low,
medium, high, and urgent.
Version 1.0 is a complete single-user daily task workflow. Multi-user accounts, collaborative boards, and third-party task integrations are intentionally out of scope. See CONTRIBUTING.md before proposing changes.
