Dinam is a React + Vite personal dashboard app designed for a new-tab-style experience. It brings quick-launch shortcuts, browser bookmarks, a daily quote, focus items, market/news headlines, configurable search, and an optional assistant into one responsive layout.
Appearance and behavior are customizable from the dashboard: light/dark/system theme, accent presets, optional wallpaper, search engine settings, and OpenAI-compatible assistant settings.
Dashboard state is managed in src/context/dashboard-state.tsx. Focus items and quick-launch links persist in localStorage; wallpaper images are stored with IndexedDB; settings use browser storage; external quote and news data are fetched live and cached/fallback where appropriate.
If Dinam is useful to you, star this repository on GitHub - it helps others discover the project and keeps us motivated to improve it.
- Features
- Tech Stack
- Fork & Clone Repository
- Getting Started
- Run Locally
- Browser Extension Status
- Production Release (Chrome Extension)
- Scripts
- End-to-End Testing
- Adding UI Components
- Project Layout
- Contributing
- License
- Dashboard layout - Responsive new-tab-style dashboard with focused sections
- Header - Search, image search, voice search where supported, date/time, theme toggle, assistant entry point, and settings
- Quick launch - Editable shortcut grid with fetched metadata and favicons
- Bookmarks - Browser bookmark tree when browser APIs are available
- Quote card - Daily quote fetched from a stoic quote API with cached fallback
- Focus items - Local task list with progress and completion state
- Market/news headlines - Hacker News/Algolia-powered headlines with local cache
- Theming - Light/dark/system theme, accent presets, and optional compressed wallpaper
- Assistant - Optional OpenAI-compatible chat assistant configured from settings
- React 19 + TypeScript
- Vite 7
- Tailwind CSS 4
- shadcn/ui (Radix primitives,
class-variance-authority,tailwind-merge) - Playwright for E2E tests
-
Fork this repository.
-
Clone your fork:
git clone https://github.com/<your-username>/dinam.git
cd dinam- Add the upstream remote (optional):
git remote add upstream https://github.com/AshutoshDash1999/dinam.gitRequirements: Node.js compatible with the versions used by the project. CI currently uses Node.js 22.
Install dependencies:
npm installStart the Vite development server:
npm run devOpen the URL Vite prints, usually http://localhost:5173, for fast refresh while you work on the dashboard UI.
Preview a production build locally:
npm run build
npm run previewDinam includes a Manifest V3 file in public/manifest.json, and npm run build copies it into dist/ so you can load Dinam as an unpacked Chrome extension.
Load it in Chrome:
- Run:
npm run build
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select the generated
dist/folder
After loading, opening a new tab should show the Dinam dashboard.
Use this flow when preparing a Chrome Web Store-ready package:
- Ensure app and extension versions are in sync:
npm run sync:manifest-version
- Build and validate extension output:
npm run build:extension
- Create a release ZIP from
dist/:npm run package:extension
- Upload the generated ZIP in
release/to the Chrome Web Store dashboard.
Checklist before submitting:
dist/manifest.jsonexists and usesmanifest_version: 3chrome_url_overrides.newtabpoints to an existing file indist/- icon files exist for 16/48/128 and are referenced in
manifest.json - store listing includes description, screenshots, and privacy policy
| Command | Description |
|---|---|
npm run dev |
Dev server with HMR |
npm run build |
Typecheck + production build |
npm run sync:manifest-version |
Sync public/manifest.json version with package.json |
npm run validate:extension |
Validate built extension artifacts in dist/ |
npm run build:extension |
Sync version, build, and validate extension output |
npm run package:extension |
Create release ZIP for Chrome Web Store from dist/ |
npm run release:extension |
Run full extension release pipeline (build + package) |
npm run preview |
Preview production build |
npm run lint |
ESLint |
npm run format |
Prettier for TS/TSX files |
npm run typecheck |
TypeScript --noEmit |
npm run test:e2e |
Run Playwright tests |
npm run test:e2e:ui |
Run Playwright UI mode |
npm run test:e2e:headed |
Run headed Playwright tests |
npm run test:e2e:debug |
Debug Playwright tests |
npm run prepare |
Initialize Husky hooks |
This project uses Playwright for automated end-to-end (E2E) testing across multiple browsers.
Run E2E tests:
npm run test:e2eRun tests in headed mode:
npm run test:e2e:headedDebug tests:
npm run test:e2e:debugOpen the Playwright HTML report:
npx playwright show-reportThe E2E suite currently runs against:
- Chromium
- Firefox
- WebKit
- Mobile Chrome (Pixel 5)
GitHub Actions currently validates pull requests targeting master with lint, typecheck, and production build jobs. Playwright tests are available locally through the test:e2e scripts.
- Dashboard rendering
- Task creation flow
- Theme persistence across reloads
This project uses the shadcn CLI. Example:
npx shadcn@latest add buttonComponents are added under src/components/ui and imported with the @/ alias, for example:
import { Button } from "@/components/ui/button"src/
|-- components/
| |-- animated-icons/ # Local animated icon components
| |-- dashboard/ # Dashboard sections, dialogs, and assistant panel
| |-- ui/ # Reusable shadcn/ui primitives
| `-- theme-provider.tsx
|-- config/ # Search engine presets
|-- context/ # Dashboard state provider
|-- data/ # Static/fallback data where used
|-- hooks/ # Browser, news, and dashboard hooks
|-- lib/ # Storage, search, theme, AI, and utility helpers
|-- types/ # Shared TypeScript types
|-- App.tsx # Main dashboard layout
|-- main.tsx # React entry point and providers
`-- index.css # Tailwind CSS and theme tokens
- Prioritize readability and maintainability over clever abstractions
- Keep UI patterns visually consistent with existing components
- Prefer composition over duplication
- Test changes before submitting pull requests
We welcome issues and pull requests. Please keep changes focused and consistent with existing patterns.
-
Discuss larger changes - For new features or structural refactors, open an issue first so direction and scope align.
-
One topic per PR - Easier to review and bisect than mixed unrelated edits.
-
Run checks locally:
npm run lint npm run typecheck
Fix any new warnings or errors. Use
npm run formatso TS/TSX matches Prettier, including Tailwind class sorting. -
Match the codebase - Follow existing naming, file organization, and import style (
@/alias, imports at top of file). Avoid drive-by refactors outside your change. -
Browser APIs - When behavior depends on browser-only APIs such as bookmarks, notifications, clipboard, speech, or storage, verify the relevant runtime path in addition to
npm run dev. -
Accessibility & semantics - Prefer semantic HTML, labels for controls, and reasonable focus behavior when touching UI.
-
Commits - Clear messages in imperative mood are fine. Squash or keep history readable at your discretion unless maintainers request otherwise.
Include what you expected, what happened, browser version, OS, whether you saw it in dev or production preview, and minimal steps to reproduce. Screenshots help for visual issues.
PolyForm Noncommercial License 1.0.0 - free for personal and noncommercial use. Commercial use requires explicit permission from the author.