We've spent the last few days digging into the parts of Monospace that felt sluggish — and while most of this work is invisible, you should feel it everywhere.
If you've noticed pages snapping in faster, skeleton placeholders that actually match what loads, or project tabs that no longer flash the wrong content on refresh, that's the work below.
What was slow
When you opened a project, the app asked the backend for every piece of data that project had — boards, cards, todo lists, notes, messages, activity, calendar items, subscriptions, detectors, links — all in one go, even if you only wanted to look at the Kanban board. On top of that, each one of those fetches ran one after the other rather than at the same time.
Refreshing a mobile page was the clearest symptom: you'd see a brief empty state, then a spinner, then finally the real content. On a weak mobile connection it added up to a noticeably sluggish feel.
What we changed
A short summary of the improvements, with the user-facing impact in plain English:
1. We only fetch what you're looking at. If you're on the Notes tab, we no longer pull every chat message and board card you'll never see. Each section now asks only for its own data. On pages with lots of chat history or activity, this saves real time every time you load them.
2. Everything fetches in parallel. The previous version of our main data query made the backend wait for each piece of data before starting the next. We rewrote it so all the pieces load at once. On a project with several boards and lists, this takes the same query from roughly 14 steps down to about 2.
3. The project summaries on the Orgs tab are parallel too. That list of project cards with little status dots and message counts used to process one project at a time. Now all projects load simultaneously.
4. Skeleton screens that match your layout. Instead of a spinner on a blank background, you now see a shape that looks like the page you're about to see — the right number of Kanban columns, the right chat bubble widths, the right project cards. When the real content lands, nothing shifts.
5. Different skeletons for different tabs. The Inbox, Profile, and Personal tabs each have their own shaped loading state now. Refreshing on any of them no longer flashes a random layout first.
6. Mobile and desktop no longer share code they don't need. If you're on mobile, your browser never downloads the desktop-only components, and vice-versa. That roughly halves the JavaScript you have to download on a fresh visit.
7. Heavy features only load when you open them. Whiteboards, the maintenance scheduler, subscription tracker, calendar, GitHub integration — none of these ship in the initial download anymore. They're fetched on demand the first time you open the relevant tab.
8. Refreshing on specific tabs actually works. Previously, refreshing while on a project's Maintenance or Whiteboard page could bounce you back to the Orgs list. We fixed the URL routing for all of the newer tab types — refreshing now lands you exactly where you were.
9. Swiping between items updates the URL. On mobile, swiping across a project's tab carousel now quietly updates the URL, so a refresh mid-session lands on the tab you were on, not the default board.
What's next
We're keeping an eye on the numbers. Vercel's Speed Insights gives us real measurements from real visits, and we'll target whatever's still the weakest link once these changes have had some prod traffic to prove themselves.
The goal stays the same: the workspace should feel instant. No spinners, no layout jumps, no waiting. You shouldn't have to think about performance — it should just be invisible.
Thanks for using Monospace. As always, let us know if you hit anything that feels slow.
— Cam