Business workspace hub
What changed
A business used to be five sibling routes (edit, playbook, corpus, publishing, content) with no way to move between them except back links. The hub now lives at /app/business/[id]/content and its tabs are routes:
| Tab | Route |
|---|---|
| Edit | /app/business/[id]/content/edit |
| Playbook | /app/business/[id]/content/playbook |
| Content | /app/business/[id]/content |
| Brand Base | /app/business/[id]/content/corpus |
| Publishing | /app/business/[id]/content/publishing |


BusinessWorkspaceTabs.vue (connect layer) renders the bar on every tab page — but not on the board's card drill-in (content/[itemId].vue), which is a drill-in, not a tab.
Why routes, not a client-side tab state
Each tab deep-links and the browser back button works. A parent content.vue + <NuxtPage/> shell would have wrapped the item drill-in in tabs too, so the bar is a component each page renders instead.
Old URLs
edit, playbook, corpus, publishing are now tiny await navigateTo(...) redirect pages, so old bookmarks and links keep working. Internal links were repointed (business card, AddBusinessModal, BusinessInitial, the playbook flow stepper, the media page's dead /app/businesses link).
Creation flow
- The promo checkbox step (
StepZero) was removed — pure friction before the user has a business. - The channels and competitors chosen in the extraction step are now persisted: they live on the modal, not the extracted result, so
submitFinalFormmerges them intoentityDetails. Previouslychannelswas hardcoded[]and competitors were never saved at all. - The card is now one compact row (initial, name, status, one meta line) with edit/playbook/Google/delete collapsed into an overflow menu.
Gotchas
- Moving a page into
content/changes its relative<i18n src>.edit.vueneeds../../business.json;BusinessPlaybook.vue's#site/.../[id]/playbook.jsonmoved to[id]/content/playbook.json. - Static tab routes (
content/edit.vue) outrank the dynamiccontent/[itemId].vue— that is what keeps/content/editfrom being read as an item id. publish.vuestays a route (the composer) and the Publishing tab links to it as "New publication" rather than embedding it.
Verify
/app/business/<id>/contentshows five tabs; each renders without a nested header./app/business/<id>/editredirects to/content/edit.- Creating a business with channels/competitors saves them into
entity_details.