πŸ’€ 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

Homepage Bookmark Search Settings Color Pallete Task Integration Bookmark Ordering


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

BrowserEngineNotes
Google ChromeChromiumPrimary target. All APIs supported since Chrome 102.
Microsoft EdgeChromiumFull MV3 + chrome.identity support. Load via Manage Extensions β†’ Load unpacked.
BraveChromiumFully compatible. Load via Settings β†’ Extensions β†’ Developer mode.
OperaChromiumSupported via Opera's built-in extension loader (Opera 80+).
VivaldiChromiumFully compatible. Load via Tools β†’ Extensions β†’ Developer mode.
ArcChromiumFully compatible. Load via Chrome extension sidebar in developer mode.
Yandex BrowserChromiumFully compatible.
Kiwi BrowserChromiumMobile Chrome extension support on Android - works including OAuth flow.

❌ Not supported

BrowserReason
FirefoxUses 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.
SafariUses 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 / or Ctrl+K to 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)

  1. Open Chrome β†’ chrome://extensions/
  2. Enable Developer mode (top right toggle)
  3. Click Load unpacked β†’ select this folder
  4. 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

  1. Go to https://console.cloud.google.com

  2. Create a new project (or select an existing one)

  3. Enable the Google Tasks API: APIs & Services β†’ Enable APIs β†’ search "Tasks API"

  4. Go to APIs & Services β†’ Credentials β†’ Create Credentials β†’ OAuth client ID

  5. Application type: Web Application

  6. 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.

  7. Copy the generated Client ID

  8. 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

  1. Click Save Settings
  2. Click Connect Google Account
  3. Approve the consent screen
  4. Done - your token is managed entirely by Chrome and never written to disk

Supported Fonts

All fonts are loaded on-demand from Google Fonts:

FontStyle
JetBrains MonoDefault - crisp, designed for code
Fira CodeLigature-rich, warm
Source Code ProAdobe's clean workhorse
IBM Plex MonoCorporate precision
InconsolataHumanist mono, highly readable
Roboto MonoFamiliar, neutral
Space MonoGeometric, retro feel
Courier PrimeClassic typewriter, refined
OxaniumFuturistic, angular
Share Tech MonoStark, technical

Built-in Color Schemes

24 pre-built TUI-inspired palettes covering the full spectrum of terminal aesthetics:

NameMood
Gruvbox DarkWarm amber on charcoal
Gruvbox LightInverted, parchment tones
Catppuccin MochaSoft pastel on deep navy
Catppuccin MacchiatoCooler mauve variant
Catppuccin FrappΓ©Mid-tone lavender
Catppuccin LatteLight, cream background
NordIcy blue on arctic grey
Tokyo NightDeep blue-black, electric accent
Tokyo DayLight Tokyo - blue on linen
MonokaiClassic dark with lime accent
DraculaPurple & pink on near-black
Solarized DarkEthan Schoonover's original dark
Solarized LightSchoonover's light variant
One DarkAtom's flagship dark theme
Ayu DarkDeep ink, amber highlights
Ayu MirageSofter dark, warm orange
Everforest DarkMuted greens, earthy tones - default
RosΓ© PineDeep violet, dusty rose
RosΓ© Pine MoonCooler violet variant
KanagawaJapanese ink wash, steel blue
HorizonDark purple, coral accent
Material DarkGoogle Material, teal accent
PoimandresDeep navy, mint accent
ChalkNear-black, soft pink

Clicking a palette previews it live. Hit Save Settings to persist.


Security model

WhatWhere storedOn disk?
Settings, bookmarkslocalStorageYes (no credentials)
Favicon cachelocalStorageYes (data URLs only)
Task title cachelocalStorageYes (not sensitive)
OAuth tokenchrome.storage.sessionNo - RAM only
  • chrome.identity manages the full OAuth flow. Your JavaScript never sees the raw token during the consent step.
  • chrome.storage.session clears 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, and tasks_token - credentials never leave the browser via the backup flow.

Keyboard shortcuts

KeyAction
/ or Ctrl+KFocus bookmark search
↓ from searchMove focus to first result
↑ / ↓ in resultsNavigate bookmark links
Enter on a resultOpen link
Esc from searchClear and blur
Esc from resultReturn focus to search input
Click clockToggle 12h / 24h
Ctrl+S / Cmd+SSave 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

License

MIT License