DueBit is a cross-platform desktop application built with Electron.js and React for managing tasks by breaking them down into smaller, actionable “bits.” Designed to be sleek, offline-first, and distraction-free, DueBit combines the flexibility of a web interface with the performance and persistence of a native desktop app.
- 🧩 Task → Bit Breakdown — Split tasks into smaller “bits” with individual do-dates.
- 📅 Smart Time Sections — Automatically organizes bits into:
- Today
- Tomorrow
- Later (sorted by date)
- Late (only appears when needed)
- 🎯 Topic-Based Organization — Group tasks under topics with color-coding.
- 🎨 Color-Coded Workflow — Bits and tasks inherit their topic’s color.
- 🖱️ Hover Actions (In Progress) — Quick actions like:
- Mark complete
- Edit bit
- 🔔 Snackbar Notifications — Temporary notifications with undo support (in progress).
- 💽 Local SQLite Database — Fully offline, no accounts required.
- 🔗 Relational Data Model
- Topics → Tasks → Bits
- ⚡ Fast Queries via Electron IPC
- 🔄 Undo Support for Deletes (in progress)
- 👤 Save user display name
- 🧹 Clear all app data
- 📤 Export data (JSON/CSV planned)
- 📥 Import data for migration between devices
- ⚡ Cross-Platform Desktop App — macOS, Windows, Linux via Electron
| Layer | Technology |
|---|---|
| UI | React.js, CSS |
| Desktop Runtime | Electron.js |
| Database | SQLite (better-sqlite3) |
| IPC Layer | Electron preload + ipcMain/ipcRenderer |
| Build Tools | Node.js, npm, Webpack |
duebit/ ├── public/ ├── src/ │ ├── components/ │ ├── pages/ │ ├── utils/ │ └── App.js ├── electron/ │ ├── main.js │ ├── preload.js │ └── db.js ├── build/ ├── package.json └── README.md
DueBit uses a three-layer architecture:
- Handles UI, state, and user interactions
- Calls backend functions via
window.duebit
- Exposes a secure API
- Handles IPC requests (
ipcMain) - Executes SQLite queries via
better-sqlite3 - Manages relational data integrity
- id
- name
- color
- weekly_time_goal
- id
- name
- topic_id
- num_bits
- repeats
- due_datetime
- due_on
- id
- task_id
- description
- do_date
- complete
- A Topic has many Tasks
- A Task has many Bits
- Bits inherit display color from their task’s topic
- topics.getAll()
- topics.create(topic)
- topics.update(topic)
- topics.delete(topicId)
- tasks.getAll()
- tasks.getById(id)
- tasks.create(task)
- tasks.update(task)
- tasks.delete(id)
- tasks.setComplete(id, complete)
- bits.getByTaskId(taskId)
- bits.update(bit)
- bits.setComplete(id, complete)
- bits.delete(id)
- settings.getUserName()
- settings.setUserName(name)
- settings.clearAppData()
- settings.exportAllData()
- settings.importAllData(data)
npm install
npm run build
npm run electron
If you see: NODE_MODULE_VERSION mismatch
Run: npm rebuild better-sqlite3
(Optional) "rebuild-native": "electron-rebuild -f -w better-sqlite3"
mainWindow.webContents.openDevTools();
- window.duebit undefined → preload not loaded
- IPC crashes → missing import in main.js
- Data not rendering → missing relationships
- Offline-first
- Minimal friction
- Composable productivity
- Local ownership of data
Kaylin Von Bergen
MIT License