π DashStartpage
April 13, 2026 Β· View on GitHub
A minimal, monospaced browser startpage that gets out of your way - and actually stays out of your way.
Every time you open a new tab, you get exactly what you need: the time, your tasks, and your bookmarks - nothing else. No widgets, no news feed, no distractions. Just a fast, keyboard-driven launchpad with the aesthetic of a terminal and the polish of a product you'd actually pay for.
Syncs your Google Tasks bidirectionally, so the to-do you added on your phone shows up here, and vice versa. Falls back gracefully to on-device tasks when you're offline or unauthenticated. Your OAuth token never touches disk - it lives in RAM and dies when the browser closes.
Screenshots

Browser support
DashStartpage is built on Manifest V3 and relies on three Chrome extension APIs: chrome.identity (OAuth flow), chrome.storage.session (RAM-only token), and chrome.storage (settings). Any Chromium-based browser that supports MV3 and exposes these APIs will run it without modification.
β Fully supported
| Browser | Engine | Notes |
|---|---|---|
| Google Chrome | Chromium | Primary target. All APIs supported since Chrome 102. |
| Microsoft Edge | Chromium | Full MV3 + chrome.identity support. Load via Manage Extensions β Load unpacked. |
| Brave | Chromium | Fully compatible. Load via Settings β Extensions β Developer mode. |
| Opera | Chromium | Supported via Opera's built-in extension loader (Opera 80+). |
| Vivaldi | Chromium | Fully compatible. Load via Tools β Extensions β Developer mode. |
| Arc | Chromium | Fully compatible. Load via Chrome extension sidebar in developer mode. |
| Yandex Browser | Chromium | Fully compatible. |
| Kiwi Browser | Chromium | Mobile Chrome extension support on Android - works including OAuth flow. |
β Not supported
| Browser | Reason |
|---|---|
| Firefox | Uses its own WebExtensions API. chrome.identity.launchWebAuthFlow and chrome.storage.session are not available or behave differently. A Firefox port would require a separate manifest and polyfills. |
| Safari | Uses Safari Web Extensions with a different toolchain and API surface. Not compatible without a full rewrite. |
Minimum version requirement
The binding constraint is chrome.storage.session, introduced in Chrome 102 (May 2022). Any Chromium-based browser built on Chromium 102 or later is sufficient.
Features
- Clock - large, minimal, click to toggle 12h / 24h. Blinks the colon every second.
- Greeting - time-aware (morning / afternoon / evening / night) or fully custom.
- Bookmarks - grouped by category, alphabetically sorted within each group, with favicons fetched and cached locally. Keyboard-navigable with
/orCtrl+Kto search. - Tasks - Google Tasks integration (add, complete, delete, due dates) with a 5-minute local cache. Falls back to fully offline on-device tasks when not connected.
- Themes - 24 built-in color schemes, a full custom color editor, and a named palette system to save and swap your own.
- Fonts - 10 curated monospace fonts, switchable live with a preview.
- Category ordering - drag-and-drop to control the column order of your bookmarks.
- Export / Import - full JSON backup and restore of settings and bookmarks. Credentials are never exported.
- Favicon cache - fetched once, stored as data URLs in
localStorage, refreshed every 7 days.
Install (unpacked)
- Open Chrome β
chrome://extensions/ - Enable Developer mode (top right toggle)
- Click Load unpacked β select this folder
- Open a new tab
Google Tasks setup
You need a Google Cloud project with the Tasks API enabled and an OAuth 2.0 client configured for a Chrome extension. The whole flow uses the implicit grant - no client secret required.
Step 1 - Google Cloud Console
-
Create a new project (or select an existing one)
-
Enable the Google Tasks API: APIs & Services β Enable APIs β search "Tasks API"
-
Go to APIs & Services β Credentials β Create Credentials β OAuth client ID
-
Application type: Web Application
-
Fill the Application Name field. Leave Authorized JavaScript Origins blank. Set Authorized Redirect URIs to:
https://<your-extension-id>.chromiumapp.org/Find your extension ID at
chrome://extensions/after loading the extension unpacked. -
Copy the generated Client ID
-
Go to Google Auth Platform β Audience and add your Google account email under Test Users
Step 2 - Paste the Client ID
Open the startpage settings (top-right corner) and paste your Client ID into the Client ID field under the Tasks section.
Step 3 - Reload and connect
- Click Save Settings
- Click Connect Google Account
- Approve the consent screen
- Done - your token is managed entirely by Chrome and never written to disk
Supported Fonts
All fonts are loaded on-demand from Google Fonts:
| Font | Style |
|---|---|
| JetBrains Mono | Default - crisp, designed for code |
| Fira Code | Ligature-rich, warm |
| Source Code Pro | Adobe's clean workhorse |
| IBM Plex Mono | Corporate precision |
| Inconsolata | Humanist mono, highly readable |
| Roboto Mono | Familiar, neutral |
| Space Mono | Geometric, retro feel |
| Courier Prime | Classic typewriter, refined |
| Oxanium | Futuristic, angular |
| Share Tech Mono | Stark, technical |
Built-in Color Schemes
24 pre-built TUI-inspired palettes covering the full spectrum of terminal aesthetics:
| Name | Mood |
|---|---|
| Gruvbox Dark | Warm amber on charcoal |
| Gruvbox Light | Inverted, parchment tones |
| Catppuccin Mocha | Soft pastel on deep navy |
| Catppuccin Macchiato | Cooler mauve variant |
| Catppuccin FrappΓ© | Mid-tone lavender |
| Catppuccin Latte | Light, cream background |
| Nord | Icy blue on arctic grey |
| Tokyo Night | Deep blue-black, electric accent |
| Tokyo Day | Light Tokyo - blue on linen |
| Monokai | Classic dark with lime accent |
| Dracula | Purple & pink on near-black |
| Solarized Dark | Ethan Schoonover's original dark |
| Solarized Light | Schoonover's light variant |
| One Dark | Atom's flagship dark theme |
| Ayu Dark | Deep ink, amber highlights |
| Ayu Mirage | Softer dark, warm orange |
| Everforest Dark | Muted greens, earthy tones - default |
| RosΓ© Pine | Deep violet, dusty rose |
| RosΓ© Pine Moon | Cooler violet variant |
| Kanagawa | Japanese ink wash, steel blue |
| Horizon | Dark purple, coral accent |
| Material Dark | Google Material, teal accent |
| Poimandres | Deep navy, mint accent |
| Chalk | Near-black, soft pink |
Clicking a palette previews it live. Hit Save Settings to persist.
Security model
| What | Where stored | On disk? |
|---|---|---|
| Settings, bookmarks | localStorage | Yes (no credentials) |
| Favicon cache | localStorage | Yes (data URLs only) |
| Task title cache | localStorage | Yes (not sensitive) |
| OAuth token | chrome.storage.session | No - RAM only |
chrome.identitymanages the full OAuth flow. Your JavaScript never sees the raw token during the consent step.chrome.storage.sessionclears automatically when the browser closes.- On a 401 response, the token is evicted immediately and the user is prompted to refresh.
- Export deliberately strips
oauth_client_id,oauth_client_secret, andtasks_token- credentials never leave the browser via the backup flow.
Keyboard shortcuts
| Key | Action |
|---|---|
/ or Ctrl+K | Focus bookmark search |
β from search | Move focus to first result |
β / β in results | Navigate bookmark links |
Enter on a result | Open link |
Esc from search | Clear and blur |
Esc from result | Return focus to search input |
| Click clock | Toggle 12h / 24h |
Ctrl+S / Cmd+S | Save settings (settings page) |
File structure
dash-startpage/
βββ manifest.json MV3, oauth2 block, strict CSP
βββ index.html Main startpage
βββ settings.html Settings page
βββ css/
β βββ style.css Shared styles + CSS variables
β βββ settings.css Settings page styles
βββ js/
β βββ storage.js localStorage + chrome.storage.session abstraction
β βββ clock.js Clock tick and 12h/24h toggle
β βββ bookmarks.js Bookmark grid renderer + favicon cache
β βββ tasks.js Google Tasks API + local tasks + auth
β βββ main.js Entry point - theme application + keyboard shortcuts
β βββ settings.js Settings page logic
βββ icons/
βββ icon.png Extension icon (16 / 48 / 128)
Tech notes
- Manifest V3 - fully compliant, no background service worker required
- Zero external runtime dependencies - plain ES6 modules, no build step, no bundler
- CSP-hardened - strict
default-src 'self'with explicit allowlists only for Google Fonts, favicon service, and Tasks API - Favicon service - uses favicon.im, deduplicated in-flight fetches, 7-day TTL for hits, 90-day TTL for 404s to avoid repeated failed requests
- Task cache - 5-minute TTL in
localStorage, keyed per list ID, invalidated on any write operation