A personal dashboard Chrome/Brave extension that replaces the new tab page. Built with vanilla JS, no build step required.
- RSS Feeds — Configurable feeds (Hacker News, The Verge, TechCrunch + any custom URL). Favicons, thumbnails, relative timestamps, HN upvote/comment counts, and read/unread tracking that persists across sessions.
- Google Calendar — OAuth-connected, shows the next 7 days across multiple calendars. Each event has a colored dot matching its calendar color and links directly to the event. The next upcoming event is highlighted with a live countdown ("Starting in 23m").
- Google Tasks — Shows your task list with the ability to add new tasks inline and mark tasks as done with a single click.
- Quick Links — Grouped bookmarks with emoji icons, editable directly on the dashboard.
- Currency Converter — Live USD → BRL rates with a real-time conversion input.
- Quote of the Day — Daily quote via ZenQuotes, cached for 24 hours.
- Sun Arc — Visual sun-position arc in the topbar showing where you are in the day, with a live greeting (Good morning / Good afternoon / Good evening).
- Drag & drop — Reorder any widget across the 4-column grid; layout is saved automatically.
- Collapsible widgets — Every card has a chevron to collapse it to just the header row; state persists.
- Show / hide widgets — "✎ Edit" mode lets you remove cards from the dashboard and add them back via a slide-up panel.
- Read / unread RSS — Clicked headlines fade to muted gray so fresh stories stand out on every glance.
- Clone or download this repo
- Open
brave://extensionsorchrome://extensions - Enable Developer mode
- Click Load unpacked → select the project folder
- Copy the Extension ID shown on the card
- Go to console.cloud.google.com → create a new project
- Enable Google Calendar API and Google Tasks API
- Configure the OAuth consent screen (External; add your Gmail as a test user)
- Create an OAuth 2.0 Client ID → Application type: Web application
- Under Authorized redirect URIs, add:
https://<YOUR_EXTENSION_ID>.chromiumapp.org/ - Copy the Client ID into both:
js/widgets/calendar.js→CLIENT_IDjs/widgets/tasks.js→CLIENT_ID
- Reload the extension
Open a new tab → click ⚙ Settings → RSS Feeds → add any feed URL. The widget appears automatically on the next new tab.
newtab/
├── manifest.json # MV3 manifest
├── newtab.html # Dashboard page
├── settings.html # Settings page
├── css/
│ ├── styles.css # Dashboard styles
│ └── settings.css # Settings page styles
├── js/
│ ├── storage.js # chrome.storage wrappers
│ ├── app.js # Bootstrap & widget manager
│ ├── drag.js # Drag-and-drop + layout persistence
│ ├── settings.js # Settings page logic
│ └── widgets/
│ ├── quote.js # Quote of the Day + shared utilities
│ ├── currency.js # Currency converter
│ ├── quicklinks.js # Quick Links (inline editable)
│ ├── rss.js # RSS / Atom reader
│ ├── calendar.js # Google Calendar (OAuth)
│ └── tasks.js # Google Tasks (OAuth)
└── icons/
├── icon16.png
├── icon48.png
└── icon128.png
- Vanilla JS — no frameworks, no build step
- Chrome Extension Manifest V3
chrome.identity.launchWebAuthFlowfor OAuth (works in both Chrome and Brave)chrome.storage.syncfor layout, links, feed configchrome.storage.localfor caches and OAuth tokens- HTML5 Drag and Drop API with MutationObserver for dynamic handle injection