Donezo is a Chrome new tab extension for day-to-day engineering work. It replaces the default new tab page with a dashboard that combines GitHub, Jira, Today focus, and local notes into one workspace.
The app is built with React, TypeScript, Vite, and Tailwind CSS. It is currently optimized for a personal workflow, but the codebase is structured around configurable local settings for GitHub and Jira.
When the extension is loaded in Chrome, opening a new tab shows a dashboard with:
- a dashboard header and integration switcher
- a GitHub workspace card for your PRs, team PRs, and review requests
- a Jira workspace card for active assigned issues
- a Today focus board for the top items you want to close today
- a notes card for quick local capture
- a settings page for profile, GitHub, and Jira configuration
The GitHub side of the dashboard includes:
- your open pull requests
- recent team pull requests
- pull requests requesting your review
- review status, CI status, merge state, and draft state signals
- status filters such as approved, ready to merge, and waiting review
- owner or organization scoping through Settings
The dashboard fetches GitHub data through the extension background service worker rather than calling GitHub directly from the React UI.
The Jira side of the dashboard includes:
- active assigned issues
- in-progress issue counts
- blocking issue counts
- high-priority issue counts
- links back to Jira
The default Jira query used by the app is:
assignee = currentUser() AND statusCategory != Done ORDER BY priority DESC, updated DESC
Today focus is a small planning board for the day.
It supports:
- dragging Jira issues into Today focus
- dragging GitHub pull requests into Today focus
- nesting GitHub pull requests under Jira items
- reordering top-level items and nested pull requests
- a limit of 3 top-level focus items
- manual tasks with a preview-first details view and explicit edit flow
It also has some useful automation:
- when you add a Jira ticket, GitHub pull requests with the same Jira key in the PR title are linked automatically
- standalone GitHub pull requests with the same Jira key can be grouped under the related Jira item
- Jira-backed focus items stay synced with fresh Jira title and status data
- GitHub-backed focus items stay synced with fresh PR title, URL, and review status data
- if a focus item is no longer present in the main dashboard payload, fallback lookups try to refresh Jira issue details and GitHub PR terminal states
Manual tasks support:
- creating standalone focus tasks
- Markdown notes with headings, lists, checkboxes, links, inline code, and fenced code blocks
- clickable checklist toggles inside the manual-task preview
- a preview mode before edit mode
- completion state directly on the Today focus card
- chrome-storage persistence for task content and ordering
Donezo still surfaces pull request warning activity through dashboard signals and browser chrome:
The favicon changes when the dashboard detects:
- failed build attention
- warning attention
- new comment attention
- ready-to-merge attention
The document title also shows the active attention count when one of those states is present.
GitHub data can be scoped to a specific owner or organization from Settings.
Behavior:
- the owner list is loaded from GitHub when you open the dropdown
- leaving it on
Allkeeps the combined view - the selected owner filter affects dashboard data and repository search indexing
Donezo includes a repository launcher for fast GitHub navigation.
Features:
- open from the dashboard header
- keyboard shortcut:
Cmd+KorCtrl+K - ranked search across indexed repositories
- owner-aware repository indexing
- keyboard navigation with arrow keys and
Enter - ability to hide repositories from search results
- hidden repositories can be restored from Settings
The app has two runtime layers:
- The React UI in
src/ - A Chrome extension background service worker in public/background.js
The React app does not perform the main GitHub and Jira API requests directly. Instead it sends messages through chrome.runtime.sendMessage(...) to the background service worker, and the background worker performs the API calls and caching.
This matters because:
- full GitHub and Jira integration only works in the extension runtime
- plain Vite dev mode is still useful for UI work and local behavior, but the Chrome message bridge is not fully available there
The GitHub integration uses:
- REST API calls for connection checks and pull-request-related signals
- GraphQL API calls for pull request search and metadata
The dashboard currently fetches:
- PRs authored by you
- recent team pull requests
- PRs requesting your review
- review decision state
- merge state
- CI and check state
- repository search index data
GitHub data is cached and refreshed through the background worker. The app also watches for dashboard cache changes and foreground visibility changes so the UI stays in sync.
The Jira integration uses Atlassian REST APIs with:
- Jira base URL
- Atlassian account email
- Jira API token
The dashboard derives:
- active issue counts
- in-progress counts
- blocking issue relationships
- high-priority issue subsets
- Jira browse links
Jira data is also cached and refreshed through the background worker and UI refresh flow.
The Settings page manages:
- display name
- GitHub username
- GitHub personal access token
- dashboard owner or org filter
- hidden repositories restore list
- Jira base URL
- Jira email
- Jira API token
- GitHub dev mode toggle
Connection testing is built into the Settings page for both GitHub and Jira.
Settings and dashboard-local state are stored locally.
Depending on runtime, the app uses:
chrome.storage.localinside the extensionlocalStoragefallback for local browser UI usage
Stored data includes:
- profile name
- GitHub settings
- Jira settings
- notes
- Today focus items
- active dashboard view state
- GitHub attention state
- hidden repositories
- cached GitHub and Jira dashboard data
The app expects a GitHub personal access token.
The Settings page currently documents these scopes:
reponotificationsread:userread:org
You should also enter:
- your GitHub username
- an optional default owner or org filter
The Jira integration expects:
- your Jira site URL, for example
https://your-company.atlassian.net - your Atlassian account email
- an Atlassian API token
Typical setup flow:
- Create an Atlassian API token.
- Use your Jira email address.
- Use the API token rather than your Atlassian password.
- Save the values in Settings.
- Test the connection from the Settings page.
- Node.js
- npm
- Google Chrome
npm installnpm run devThis watches the source files and writes a development build to dist/. Load the
dist/ folder in Chrome to use the extension runtime with development-only
mock data controls enabled.
npm run dev:serverImportant limitation:
- this runs the React app in normal browser dev mode
- the Chrome extension background runtime is not active there
- GitHub and Jira flows that depend on
chrome.runtime.sendMessage(...)will not fully work
Vite dev mode is mainly useful for:
- layout and styling work
- component development
- non-extension local state behavior
npm run buildThis outputs the packaged extension to dist/.
npm run previewAfter building:
- Open
chrome://extensions - Enable Developer mode
- Click
Load unpacked - Select the
dist/folder
Once loaded, opening a new Chrome tab should show Donezo instead of the default new tab page.
If you make code changes:
- Re-run
npm run build - Reload the extension in
chrome://extensions
The dashboard supports a stored GitHub dev mode for mock scenarios.
How it works:
- GitHub dev mode is enabled from the Settings page
- once enabled, dev mode is stored locally
- the active mock scenario is selected from the header menu
- the Settings page includes an
Enable dev modetoggle
Notes:
- scenario selection still happens in the UI
- clearing dev mode returns the dashboard to live GitHub data
Key files and modules:
- src/App.tsx: app bootstrapping, routing, settings loading, and dashboard composition
- src/pages/DashboardPage.tsx: main dashboard composition
- src/pages/SettingsPage.tsx: settings and connection management
- src/components/GitHubCard.tsx: GitHub dashboard UI
- src/components/JiraCard.tsx: Jira dashboard UI
- src/components/SummaryCard.tsx: Today focus board UI and manual-task preview/editor flow
- src/components/GitHubRepoLauncher.tsx: repository search launcher UI
- src/hooks/useGitHubDashboard.ts: GitHub dashboard loading and refresh behavior
- src/hooks/useJiraDashboard.ts: Jira dashboard loading and refresh behavior
- src/hooks/useTodayFocusState.ts: Today focus state and mutations
- src/hooks/useTodayFocusFallbacks.ts: focused fallback refresh logic for Today focus items
- src/hooks/useFaviconState.ts: favicon and title warning state
- src/lib/githubApi.ts: UI-side GitHub bridge helpers
- src/lib/jiraApi.ts: UI-side Jira bridge helpers
- src/lib/githubDomain.ts: GitHub domain rules
- src/lib/githubCardDomain.ts: GitHub card list shaping and summary helpers
- src/lib/jiraDomain.ts: Jira domain rules
- src/lib/todayFocusSync.ts: Today focus reconciliation logic
- src/lib/focusMapping.ts: Jira and PR to focus-item mapping
- src/lib/githubRepoSearchDomain.ts: repository ranking and search scoring
- src/lib/storage/: storage modules for settings, notes, focus items, preferences, and defaults
- public/background.js: Chrome extension background worker and external API access
- public/manifest.json: Chrome extension manifest
npm run dev- watch and build the extension intodist/with development-only controlsnpm run dev:server- run the Vite development servernpm run build- type-check and build the extension intodist/npm run preview- preview the built Vite app locally
- the app is primarily shaped around one personal workflow
- full GitHub and Jira behavior depends on the extension runtime
- there is currently no automated test harness configured in the repo
The extension currently requests:
storagealarms- host access to
https://api.github.com/* - host access to
https://*.atlassian.net/*