Skip to main content

max / goingson

exorcise: convert ASCII '--' prose dashes to colons Uniform '--' dash pass (per Max's decision) across README, contributing, frontend_architecture: 30 conversions, bold/code-span lead-ins to colons, mid-sentence to period/comma. CLI flags, arrows, CSS vars, code fences untouched (protected-token counts unchanged). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-12 16:56 UTC
Commit: 68d79f536c450122de123e2b03a8a520b529ea12
Parent: b8ea7ee
3 files changed, +31 insertions, -31 deletions
M README.md +16 -16
@@ -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