Services

Apps Manager Admin


SEO review: apps/manager and apps/admin

Date: 2026-07-01

Scope and indexing expectation#

apps/manager and apps/admin are authenticated SaaS/admin dashboards, not public acquisition content. They should be kept out of public search indexes. The desired posture is defense in depth: HTML robots meta, HTTP X-Robots-Tag, and deployment-level robots handling where each app is exposed.

Findings by severity#

High#

  • apps/admin is missing any explicit noindex control. Its Vite entrypoint sets charset, color-scheme, viewport, and title only; there is no <meta name="robots" content="noindex, nofollow"> in apps/admin/index.html:17-19. There is also no apps/admin/public/_headers or apps/admin/public/robots.txt in the app tree, so a deployed static host would not emit an X-Robots-Tag equivalent. Because the app is private/admin-only (apps/admin/package.json:2-10) and routes redirect unauthenticated users to login while guarding app routes with requireAuth (apps/admin/src/router.tsx:14-18), indexing should be blocked explicitly even if crawlers only see the login shell.

Medium#

  • apps/admin has minimal document metadata and no icon/manifest assets. The entrypoint has a generic <title>SaaS Admin</title> at apps/admin/index.html:19, but no meta description, favicon link, theme-color, or web manifest (apps/admin/index.html:17-19; no favicon/manifest files found under apps/admin). This is not a public-ranking issue if the app is noindexed, but it affects browser tabs, install surfaces, bookmarks, and accidental search snippets if noindex is missed.
  • apps/manager noindex is good, but deployment parity should be verified outside Cloudflare Pages-style hosting. The app has HTML-level noindex, nofollow (apps/manager/index.html:31) and a static-host _headers rule adding X-Robots-Tag: noindex, nofollow for all paths (apps/manager/public/_headers:1-6). If served by the included Nginx config, however, apps/manager/nginx.conf:1-7 only defines SPA fallback behavior and does not add equivalent X-Robots-Tag headers. Any non-Pages deployment should add the same indexing block at the web-server layer.

Low#

  • apps/manager has appropriate base metadata for a private dashboard. It links a favicon (apps/manager/index.html:26), sets color-scheme/theme-color/viewport (apps/manager/index.html:27-29), and defines title/description placeholders (apps/manager/index.html:30-32) that are replaced during Vite HTML transform with branded values (apps/manager/vite.config.ts:11-20). No route-level Helmet/head management was found; for a noindexed dashboard, static app-level metadata is sufficient.
  • Neither app appears to use runtime Helmet/head management. The audited dependencies do not include react-helmet/Helmet (apps/manager/package.json:17-44, apps/admin/package.json:12-30), and searches found no Helmet or document.title usage in either app. This is acceptable for private dashboards, but any future public landing pages should use route-specific metadata in the public app instead of these admin shells.
  1. Add noindex, nofollow to apps/admin/index.html and mirror it with deployment headers (X-Robots-Tag: noindex, nofollow) for every admin route.
  2. Add an apps/admin/public/_headers file if the admin app is deployed to a static host that honors it, or configure equivalent headers in the app's actual edge/proxy/server deployment.
  3. Add basic apps/admin browser metadata: a favicon, theme-color, and a more specific title such as Admin | Assistance.
  4. If apps/manager is served through Nginx, add X-Robots-Tag: noindex, nofollow to that server/location config so the HTTP-header posture matches apps/manager/public/_headers.
  5. Keep both dashboard/admin apps private in search. Do not add canonical/open-graph/social metadata intended for public indexing unless the app's product decision changes.