Why Time Tracker Search Should Create Work, Not Just Find It - MinuteShark

Engineering

Why Time Tracker Search Should Create Work, Not Just Find It

Time tracker search is usually a lookup box. You type a fragment, you hope the right task appears, and if it does not, you leave the keyboard and go click through a client tree. That extra trip is why people stop tracking mid-morning.

MinuteShark’s dashboard search is built the other way: it finds and creates. The field says “Search anything or start a task.” Instant results come from Algolia. From the same box you can create a Client, Project, or Task badge, filter with SEARCH IN PROJECT chips, and hit play. The search is the on-ramp, not a sidecar.

The product bet: if starting a timer takes more than a search and a play icon, freelancers will reconstruct the day later — and reconstruct it wrong. Create-from-search is how we kept the keyboard in charge.

Find-only search fails the freelance day

A consultant’s morning is not a tidy backlog. A Slack ping becomes a new client. A “quick look” becomes a project that did not exist at 9:00. Enterprise search assumes the catalog is already complete and your job is retrieval. Independent work assumes the catalog is always slightly behind the work.

If search cannot create the missing node, the user has to remember a four-step onboarding path — Add Client → Add Project → Add Task → Start Task — at the exact moment they wanted a timer. Most people skip it. They start a timer on a leftover task, or they skip tracking until Friday. We already wrote about why most developer tools are not built for freelancers. Find-only search is one of those tools wearing a friendlier label.

The hierarchy still matters. Time is tracked on a task, not a vague client bucket. Search that creates a floating “misc” pile would be worse than no search. So create-from-search has to respect Workspace → Client → Project → Task (and subtasks on Standard), not invent a fifth object type to make the demo look clever.

What we actually shipped in the box

The dashboard is a giant search field on an Ionic + Angular 16 app. Results have to feel instant, including on a phone running the same UI through Capacitor 7. That is why the index is Algolia, not a client-side filter over a growing Firestore catalog. Typing should not wait for a full tree walk.

Create badges are not a second product. They are the first three steps of getting started, compressed into the place people already look. If you need the longer path, it still exists. If you need widgets around that search — starred tasks, a private notes pane, a to-do list you can play from — those live in dashboard widgets. Search stays the center of gravity.

Why we did not turn search into a command palette for everything

It is tempting to make the box do invoices, cost profiles, and report pivots. We did not. A freelancer hitting play should not land in a power-user grammar. Reports stay a What × Who × When generate step. Invoices start from a generated report and a cost profile. Those are deliberate, slower surfaces because they move money.

Search’s job is the daily loop: land on the right task, start or resume tracking, create the missing node when the work is new. MinuteShark AI covers the sentences that are awkward to type as a query — “I forgot to log 30 minutes on yesterday’s standup,” bulk-add clients, open a filtered report. The AI still proposes a confirmation card before it writes. Search is the non-chat path for people who already know the name of the task.

We also kept a hard constraint the search play icon has to honor: one running timer. A result that started a second clock would make the sidebar lie. If something is already running, starting another task is a switch, not a stack. That is a product rule enforced in the same Angular services on web and mobile, not a “nice to have” that drifts per platform.

Indexing a hierarchy without turning names into soup

Algolia is only as honest as the records we send it. Each searchable row needs enough parent context that “Homepage” can show which client and project it belongs to. It also needs to respect visibility: project team restrictions and permissions (MANAGE_ALL_PROJECTS, MANAGE_CLIENTS, and the rest) are not search features, but a result you cannot open is a bug dressed as a hit.

We index what the user can act on. Creating from search still writes through the same Firebase Functions path as the slower forms, so a Client badge is not a local-only ghost that fails to sync to the phone. Capacitor does not get a special “lite” create. The workspace is one catalog.

Project names are capped at 60 characters. That sounds fussy until you watch a search result truncate into two indistinguishable “Website Redesign — Phase…” lines. Constraints that help the index are constraints that help the invoice later.

How we tell if search is working

We do not grade the box on how many filters it exposes. We grade it on whether a freelancer can go from “new client just emailed” to a running timer without opening a settings screen.

  • Does a unique task name start in one play tap?
  • Does a missing client offer a create badge instead of an empty state lecture?
  • Does SEARCH IN PROJECT disambiguate two Homepages without making the user retype the client?
  • Does play refuse to invent a second simultaneous timer?
  • Does a create from search appear on iOS and Android after sync, not only in the browser tab that typed it?

Those are the same questions a consultant asks without using the word “index.” If the answer is no, the model of the day stays in their head, and the timesheet becomes fiction.

What we left out on purpose

Search does not scrape your calendar. It does not watch screenshots. It does not invent time from app usage. Those products already exist; they are built for a different buyer. MinuteShark search only knows the workspace you built — clients, projects, tasks, and the timer you started.

It also does not replace Reports. If you want last week by client, you still generate a report. The features list keeps search, reports, invoices, and AI as separate doors into the same hierarchy. Mixing them in one magic bar would look advanced and bill poorly.

If you are building a similar keyboard-first Ionic app, the lesson is narrower than “add Algolia.” Decide whether empty results are a failure or an invitation to create. For freelancers, empty is usually an invitation. Just make the created thing a real task you can invoice from, not a note in a search log.

Previous Post Back to Blog Next Post