Two Weeks of Bombay: 170 commits, a connector framework, and a dock menu

· bombay

Last updated 17 Feb

behind-the-scenesbombaydevelopmentrounduptools

The last two weeks have been the most productive stretch Bombay's had since its inception. Here's a rundown of what shipped.

The big picture

Bombay started as a simple Reminders-to-text-file exporter. It's now a full project dashboard with 24 projects tracked, inline task management, and autonomous work capabilities. These two weeks pushed it from "useful tool" to "core infrastructure".

Bombay dashboard showing project overview with sparklines, tags, and task counts

Connector framework

The biggest architectural change: a proper connector framework. Previously, Reminders and Desktop file watching were implemented ad-hoc with no shared abstraction. Now there's a clean pattern:

  • BaseConnector — abstract class with connect(), fetch(), filter(), disconnect()
  • ConnectorConfig — enable/disable, refresh interval, filter rules per connector
  • ConnectorItem — standard data structure for items from any source
  • ConnectorRegistry — manages lifecycle, batch operations, serialisation for the dashboard

The existing Reminders connector (EventKit) and Desktop connector (file watching) have been migrated. This sets up cleanly for the email, Slack, and WhatsApp connectors on the roadmap.

Native Mac app progress

Phases 2–5 of the native Mac app are complete:

  • Services bundled into Bombay.app via py2app (no more separate LaunchAgents)
  • Dashboard files embedded in the app bundle
  • DMG packaging script ready

The remaining blocker is code signing — waiting on Apple Developer Program membership verification.

Dashboard features

A burst of dashboard improvements shipped:

Inline kanban

Each project row now expands to show an inline kanban board of its .in/ tasks, grouped by readiness state. No more switching to Finder to see what's in a project's inbox.

Quick-add button

A + button on each project row opens an inline form to create new inbox items. Type a title, press Enter, and it lands in that project's .in/ directory as a markdown file.

Readiness state filters

Three checkboxes in the toolbar — Unrefined, Auto-refined, Refined — let you filter the project table by what kind of work is available. Combined with the existing tag filters, this makes it easy to find projects that need attention.

Inbox filters editor

The inbox filter rules (previously a YAML file you had to edit by hand) now have a built-in editor in the Settings panel. It includes syntax validation and an AI suggestions panel that analyses recent inbox items and proposes new filter rules with one-click insertion.

Visual refinements

  • Sparkline height doubled (9px → 18px) for better readability
  • Sparkline dates shown as tooltips instead of visible text
  • Coloured activity lines doubled in thickness (3px → 6px)
  • Bell emoji removed from reminder pills
  • Tag filter chips now show a tag: prefix for clarity
  • Test count column added to the project table
  • Homepage column enabled by default
  • Toolbar moved below the Reminders/Desktop/Inbox sections

Dock menu

Bombay.app now populates the macOS dock menu with projects that have pending tasks, sorted by task count. Clicking a project opens its workspace in Cursor. A small thing, but it means you can right-click the dock icon and jump straight to what needs attention.

Pipeline benchmark

A new benchmark script creates a synthetic reminder in Reminders.app and times how long it takes for Bombay to detect and sync it. The result appears in the dashboard toolbar — latest, average, and best times. This is the measurable version of the north star metric: time from voice dictation to the task appearing in the system.

End-to-end test suite

Playwright tests now cover 10 core user journeys across 13 test cases:

  1. Service health and WebSocket connectivity
  2. Project listing and filtering
  3. Reminders display
  4. Desktop items display
  5. Inbox item creation
  6. Auto-update cycle
  7. Toggle persistence
  8. Settings panel
  9. Row interactions (expand, click, quick-add)
  10. Filter combinations

All 13 pass consistently against the live dashboard.

Recurring reminders

A "Show recurring reminders" toggle in settings filters out Reminders.app's recurring items (which tend to be noise in a task dashboard). Detection uses a metadata sidecar approach since EventKit doesn't expose recurrence rules directly from the fetch predicate.

Import rules

The Reminders settings panel was refactored from a simple toggle into a full import rules property table. Each list from Reminders.app can be independently configured: import or ignore, auto-move to a specific project, apply tags.

Task processing

The /refine auto and /do refined workflow got a serious workout. Fifteen tasks were auto-investigated, refined interactively, and processed in batch — several in a single session. The task lifecycle (unrefined → auto-refined → refined → checked → closed) is now well-tested.

Blog

Three blog posts published alongside development:

  • Introducing Bombay — what it is and why it exists
  • The Inbox Method — the file-based task management philosophy behind .in/ directories
  • The UX Process — how the dashboard feedback loop works

What's next

  • Code signing & notarization — once the Apple Developer Program membership clears, the app can be distributed as a signed DMG
  • Email connector — the highest-priority new connector (tasks get lost in email)
  • Slack and WhatsApp connectors — high priority for the same reason
  • Clean Mac testing — validate the full install experience on a fresh machine

Bombay is a Danny Hope project. Read more at dannyhope.co.uk/blog.

Partially written by a human