"Hacking a browser shouldn't mean wrestling with C++."
Dark is a sleek, Electron-based browser you can bend, hack and make your own, 100% React + TypeScript under the hood. Built on Chromium (so you still get Chrome DevTools and ecosystem compatibility), Dark makes browser customization as easy as editing a React component.
-
Fully Hackable Everything in Dark is React + TypeScript. No C++ gatekeepers, if you know JS, you can extend or fork any part of the browser UI or behavior.
-
Chromium-Powered Under the hood it's the same engine that powers Chrome, so all your favorite DevTools, extensions (via
session.loadExtension), and web standards just work. -
Modern UI Built with React, Tailwind-style CSS and shadcn. Customize tabs, sidebars, themes, or even the entire address bar. The only rule is: "everything's Dark"
-
Cross-Platform Runs on macOS, Windows, and Linux, package once, ship everywhere.
-
Open & Supported Unlike Arc (which went closed-source), Dark is 100% Apache 2.0-licensed and is 100% community-driven. We'll be here to merge your PRs and ship updates.
Dark will always remain 100% open source.
We solemnly pledge that:
- Forever Open: Dark will never go closed-source, proprietary, or behind paywalls
- Permissive License: We commit to maintaining Apache 2.0 (or equivalent permissive licensing) in perpetuity
- Community Ownership: The core project will always be owned and governed by the community
- No Vendor Lock-in: You can fork, modify, redistribute, and even commercialize Dark without restriction
This isn't just a promise, it's our foundational principle. Unlike other browsers that started open and went commercial, Dark's architecture, governance, and licensing ensure it stays hackable forever.
-
Clone the repo
git clone https://github.com/tomaspiaggio/dark.git cd dark -
Install dependencies
npm install
-
Run in dev mode
npm start
Your custom browser will spin up with live-reload on React code changes.
-
Build & Package
npm run build
- All UI lives under
src/renderer/as React components. - Main-process logic (window management, IPC handlers) sits in
src/main/. - Want to override the tab switcher, add a custom sidebar widget, or tweak your new-tab page? Just dive in, edit a
.tsx, and your changes show up instantly innpm start.
We love contributions of all kinds:
- Bug reports & feature requests via GitHub Issues
- Design ideas, mockups, animations, new themes
- Documentation fixes, help us keep this README crystal clear!
Building and maintaining a browser engine wrapper is no small feat, and your support keeps Dark alive and thriving:
- ⭐ Star this repo
- 🐛 Report bugs or propose new features
- 💵 Donate
- BTC: bc1qwyz7zp2av6ftg63quqpf025eetqpssaqd7ud0y
- USDC (Polygon): 0x8C03f4c53a9a46d78D8b15E7A0Ea8D530EC3cA3F
- USDT (Polygon): 0x8C03f4c53a9a46d78D8b15E7A0Ea8D530EC3cA3F
- 🙌 Spread the word on Twitter, Mastodon, or your favorite tech blog
- 🐦 Follow updates @tomaspiaggio for the latest Dark news
Your sponsorship helps pay for CI, hosting, and coffee to fuel late-night hacking sessions.
Made with ❤️ by @tomaspiaggio and the Dark community
| Feature | Description | Implementation Notes |
|---|---|---|
| Bookmarks | Save, organize, and manage favorite websites | Persistent storage with folders, tags, and quick access toolbar |
| Command+Number | Quick switch to bookmark | When doing Command+1 you go to the first bookmark, when doing Command+2, you'll go to the second, and so on. |
| Split Screen | View multiple tabs side-by-side in the same window | Dynamic webview layout with resizable panes |
| Spaces | Separate workspaces for different contexts (work, personal, studying) | Tab grouping with isolated sessions and visual workspace indicators |
| Extensions | Support for loading Chrome extensions via session.loadExtension() |
Use Electron's extension APIs to load .crx files or unpacked extensions |
| Multiple Instances | Run multiple browser windows/processes simultaneously | Separate Electron processes for isolated browsing sessions |
| Sleep Tabs | Reduce memory usage by suspending inactive tabs | Unload tab content but preserve state for quick restoration |
| Quit Confirmation | Ask before closing browser with Cmd+Q | Prevent accidental closure with "Are you sure?" dialog |
| Config Menu | Settings/preferences interface | Persistent settings for new tab URL, tab cleanup timing, hotkeys |
| Landing Page | Custom start page when opening browser | Branded homepage with quick actions and workspace selection |
| Welcome Flow | First-run onboarding experience | Guide users through space creation and basic browser features |
| Cheatsheet | Help documentation for keyboard shortcuts | In-app reference for all available hotkeys and gestures |
| Printer Support | Print web pages and PDFs | Electron's print API with preview and printer selection |
| Enhanced New Tab | Rich new tab experience with widgets | Transform about:blank into useful start page with quick actions |
| Private Browsing | Incognito mode with no history/cookies | Isolated session that doesn't persist data after closing |
| History | Browse and search previously visited pages | Persistent history with search, date filtering, and quick access |
| Service Workers | Full support for Progressive Web Apps | Enable offline functionality and push notifications |
| Packaging & Release | Build system for distributing the browser | Electron Builder setup for macOS, Windows, and Linux packages |
| AI Features (Cmd+I) | Cursor-style AI integration with user's API key | LLM integration for page summaries, Q&A, and content assistance |
| Command+Shift+C Toast | If a user does Command+Shift+C the url gets copied to clipboard. I want to show a toast when that happens so that the user knows that something happened. Also, when the user copies on the url, show the dialog that this is a feature. |
- Copy/Paste Menu - Edit menu items that target the active tab
- Persistent State - Settings and sessions are saved between launches
- Sidebar Toggle - Collapsible sidebar for more screen space
- Find in Page (Cmd+F) - Search text within the current page
- New Tab - Create new tabs with keyboard shortcuts
- when changing tabs, the new size of the view should be the size of the window
- when closing sidebar there's a white strip
- context menu
- middle button to close tabs
- command left to go back, command [ to go back
- on new tab fix resolution
- command+l to change the current tab
- Cmd+Shift+C Copy URL - Quick keyboard shortcut to copy current page URL | Copy active tab's URL to clipboard without manual selection
- switcher on control+tab+tab doesn't close automatically, need to do enter
- title changes on the frontend but is not actually stored or returned
- when a website doesn't exist it just goes to a blank screen
- support websites starting on https:// or http://
