max / goingson
3 files changed,
+31 insertions,
-31 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | # GoingsOn | |
| 2 | 2 | ||
| 3 | - | A desktop productivity app -- tasks, email, calendar, contacts, and project management in one place. Built with Tauri 2, Rust, and vanilla JS. | |
| 3 | + | A desktop productivity app: tasks, email, calendar, contacts, and project management in one place. Built with Tauri 2, Rust, and vanilla JS. | |
| 4 | 4 | ||
| 5 | 5 | Local-first. Your data lives in a SQLite database on your own machine. No telemetry, no analytics, no remote logging. Cloud sync is optional and end-to-end encrypted. | |
| 6 | 6 | ||
| @@ -8,10 +8,10 @@ Published by Make Creative, LLC. Contact: info@makenot.work. Privacy policy: `do | |||
| 8 | 8 | ||
| 9 | 9 | ## Your data | |
| 10 | 10 | ||
| 11 | - | - **Export** -- JSON (full), CSV (tasks), ICS (calendar events). | |
| 12 | - | - **Backup and restore** -- full snapshots restorable into a fresh install. | |
| 13 | - | - **Storage** -- SQLite on disk; you can copy or back up the file directly. | |
| 14 | - | - **Updates** -- checked on launch; install is user-initiated, never forced. | |
| 11 | + | - **Export**: JSON (full), CSV (tasks), ICS (calendar events). | |
| 12 | + | - **Backup and restore**: full snapshots restorable into a fresh install. | |
| 13 | + | - **Storage**: SQLite on disk; you can copy or back up the file directly. | |
| 14 | + | - **Updates**: checked on launch; install is user-initiated, never forced. | |
| 15 | 15 | ||
| 16 | 16 | ## Prerequisites | |
| 17 | 17 | ||
| @@ -56,17 +56,17 @@ Dependency flow: `core` is leaf -> `db-sqlite` depends on `core` -> `src-tauri` | |||
| 56 | 56 | ||
| 57 | 57 | ## Features | |
| 58 | 58 | ||
| 59 | - | - **Tasks** -- urgency scoring, recurrence, snooze, subtasks, day planning (time blocking), weekly review | |
| 60 | - | - **Email** -- IMAP/SMTP and Fastmail JMAP, OAuth (Google, Microsoft, Fastmail), threaded display, compose/reply | |
| 61 | - | - **Calendar** -- events with recurrence, project/contact linking, timeline view | |
| 62 | - | - **Contacts** -- multi-field (emails, phones, social handles), tags, search | |
| 63 | - | - **Projects** -- per-project dashboards (tasks + events + emails), milestones | |
| 64 | - | - **Search** -- FTS5 full-text search across all entity types | |
| 65 | - | - **Cloud sync** -- SyncKit integration with E2E encryption | |
| 66 | - | - **Import** -- native CSV/TSV import (entity type auto-detected), plus vCard and iCalendar | |
| 67 | - | - **Themes** -- built-in light and dark themes with system auto-detection (see `src-tauri/frontend/themes/helix/`) | |
| 68 | - | - **Keyboard shortcuts** -- vim-style navigation throughout | |
| 69 | - | - **Platforms** -- macOS (primary), Windows, Linux; iOS in development | |
| 59 | + | - **Tasks**: urgency scoring, recurrence, snooze, subtasks, day planning (time blocking), weekly review | |
| 60 | + | - **Email**: IMAP/SMTP and Fastmail JMAP, OAuth (Google, Microsoft, Fastmail), threaded display, compose/reply | |
| 61 | + | - **Calendar**: events with recurrence, project/contact linking, timeline view | |
| 62 | + | - **Contacts**: multi-field (emails, phones, social handles), tags, search | |
| 63 | + | - **Projects**: per-project dashboards (tasks + events + emails), milestones | |
| 64 | + | - **Search**: FTS5 full-text search across all entity types | |
| 65 | + | - **Cloud sync**: SyncKit integration with E2E encryption | |
| 66 | + | - **Import**: native CSV/TSV import (entity type auto-detected), plus vCard and iCalendar | |
| 67 | + | - **Themes**: built-in light and dark themes with system auto-detection (see `src-tauri/frontend/themes/helix/`) | |
| 68 | + | - **Keyboard shortcuts**: vim-style navigation throughout | |
| 69 | + | - **Platforms**: macOS (primary), Windows, Linux; iOS in development | |
| 70 | 70 | ||
| 71 | 71 | ## License | |
| 72 | 72 |
| @@ -119,15 +119,15 @@ The form modal and API call infrastructure handle the rest. | |||
| 119 | 119 | ||
| 120 | 120 | Larger scope. Follow the existing pattern: | |
| 121 | 121 | ||
| 122 | - | 1. **Core model** (`crates/core/src/models/new_entity.rs`) -- struct + enums | |
| 123 | - | 2. **ID type** (`crates/core/src/id_types.rs`) -- `define_sqlite_id!(NewEntityId)` | |
| 124 | - | 3. **Repository trait** (`crates/core/src/repository.rs`) -- add trait | |
| 122 | + | 1. **Core model** (`crates/core/src/models/new_entity.rs`): struct + enums | |
| 123 | + | 2. **ID type** (`crates/core/src/id_types.rs`): `define_sqlite_id!(NewEntityId)` | |
| 124 | + | 3. **Repository trait** (`crates/core/src/repository.rs`): add trait | |
| 125 | 125 | 4. **SQLite implementation** (`crates/db-sqlite/src/repository/new_entity_repo.rs`) | |
| 126 | 126 | 5. **Migration** (`migrations/sqlite/`) | |
| 127 | - | 6. **Tauri commands** (`src-tauri/src/commands/new_entity.rs`) -- register in `main.rs` | |
| 128 | - | 7. **API methods** (`frontend/js/api.js`) -- add to the api object | |
| 129 | - | 8. **JS module** (`frontend/js/new-entity.js`) -- IIFE pattern, register on `GoingsOn.newEntity` | |
| 130 | - | 9. **Navigation** -- add sidebar entry, route handler | |
| 127 | + | 6. **Tauri commands** (`src-tauri/src/commands/new_entity.rs`): register in `main.rs` | |
| 128 | + | 7. **API methods** (`frontend/js/api.js`): add to the api object | |
| 129 | + | 8. **JS module** (`frontend/js/new-entity.js`): IIFE pattern, register on `GoingsOn.newEntity` | |
| 130 | + | 9. **Navigation**: add sidebar entry, route handler | |
| 131 | 131 | ||
| 132 | 132 | ## Code Style | |
| 133 | 133 | ||
| @@ -143,7 +143,7 @@ Larger scope. Follow the existing pattern: | |||
| 143 | 143 | - Use `GoingsOn.ui.apiCall()` for all API calls with toasts | |
| 144 | 144 | - Use `GoingsOn.ui.openFormModal()` for all CRUD forms | |
| 145 | 145 | - Use `GoingsOn.utils.escapeHtml()` / `escapeAttr()` for user data in HTML | |
| 146 | - | - No `window.X` exports -- use the `GoingsOn` namespace | |
| 146 | + | - No `window.X` exports, use the `GoingsOn` namespace | |
| 147 | 147 | - `async/await` over `.then()` chains | |
| 148 | 148 | ||
| 149 | 149 | ### CSS |
| @@ -211,19 +211,19 @@ Rust response types include display-ready values. JS never calculates dates, for | |||
| 211 | 211 | ||
| 212 | 212 | Scripts load in order via `<script>` tags in `index.html`: | |
| 213 | 213 | ||
| 214 | - | 1. `goingson.js` -- creates `window.GoingsOn` namespace | |
| 215 | - | 2. `state.js` -- creates `GoingsOn.state` | |
| 216 | - | 3. `api.js` -- creates `GoingsOn.api` | |
| 217 | - | 4. `utils.js` -- populates `GoingsOn.utils` | |
| 218 | - | 5. `components.js`, `components-modal.js`, `form-modal.js` -- populates `GoingsOn.ui` | |
| 214 | + | 1. `goingson.js`: creates `window.GoingsOn` namespace | |
| 215 | + | 2. `state.js`: creates `GoingsOn.state` | |
| 216 | + | 3. `api.js`: creates `GoingsOn.api` | |
| 217 | + | 4. `utils.js`: populates `GoingsOn.utils` | |
| 218 | + | 5. `components.js`, `components-modal.js`, `form-modal.js`: populates `GoingsOn.ui` | |
| 219 | 219 | 6. Infrastructure: `router.js`, `navigation.js`, `keyboard.js`, `selection-manager.js`, etc. | |
| 220 | 220 | 7. Domain modules: `projects.js`, `tasks.js`, `events.js`, `emails.js`, `contacts.js`, etc. | |
| 221 | 221 | 8. Feature modules: `day-planning.js`, `snooze.js`, `settings.js`, etc. | |
| 222 | - | 9. `app.js` -- initialization, event listeners, startup | |
| 222 | + | 9. `app.js`: initialization, event listeners, startup | |
| 223 | 223 | ||
| 224 | 224 | ## CSS | |
| 225 | 225 | ||
| 226 | - | Single stylesheet at `frontend/css/styles.css`. Uses CSS variables from the theme system. `styles.min.css` is auto-generated via `build-css.sh` (clean-css-cli) -- never edit it directly. | |
| 226 | + | Single stylesheet at `frontend/css/styles.css`. Uses CSS variables from the theme system. `styles.min.css` is auto-generated via `build-css.sh` (clean-css-cli). Never edit it directly. | |
| 227 | 227 | ||
| 228 | 228 | Follow the Neobrute design style (see `docs/styleguide.md`). No inline styles except for dynamic values. | |
| 229 | 229 |